Java:在列表中使用反射或存储实例对象?

你好吗?我正在尝试执行一些动态方法调用以获取 Java (Android) 中各种对象的 sql 字符串,但我对性能和稳定性有一些疑问。


上下文示例:存储库类 onCreate 方法获取所有实体对象(表)并调用方法(例如 getCreateTable)以获取要执行的 sql 字符串。


当然,我可以逐个类显式调用每个方法,但我还有其他调用,如“dropTables”、“truncateTables”等,我不想一直重复相同的结构。


public void CreateTables() {

    execute(Entity1.getCreateTable());

    execute(Entity2.getCreateTable());

    execute(Entity3.getCreateTable());

    [..]

    execute(Entity50.getCreateTable());

}


public void DropTables() {

    execute(Entity1.getDropTable());

    execute(Entity2.getDropTable());

    execute(Entity3.getDropTable());

    [..]

    execute(Entity50.getDropTable());

}

直到现在我知道我可以通过 3 种不同的方式做到这一点。


1)使用反射(目前正在使用):基本上,我将所有对象类存储在一个列表中,然后使用反射来调用所需的静态方法。但我知道反射并不总是应该是首选。


private final List<Class> entityList = new ArrayList<Class>() {

    {

        add(Entity1.class);

        add(Entity2.class);

        add(Entity3.class);

    }

};


public void createTables() {

    /* get all query strings */

    List<String> queryList = getQueryList("createTable");


    try {

        for (String query : queryList) {

            execute(query);

        }

    } catch (SQLException e) {

        [...]

    }

}


private List<String> getQueryList(String methodName) {

    List<String> queryList = new ArrayList<>();


    for (Class<?> objectClass : entityList) {

        try {

            Method[] ms = objectClass.getMethods();

            for (Method me : ms) {

                if (me.getName().equals(methodName)) {

                    String query = (String) me.invoke(null);


                    if (query != null && query.length() > 0) {

                        queryList.add((String) me.invoke(null));

                    }


                    break;

                }

            }

        } catch (Exception e) {

            [...]

        }

    }


    return queryList;

}

2)在列表中存储对象实例:我可以有一个包含实例化对象的列表,然后转换为抽象父类(或接口)并调用方法来获取 sql 字符串。在这种情况下,我不知道在内存中保留实例对象列表是否是一个好习惯,也许这可能比根据列表大小使用反射更糟糕。

3) 将所有字符串存储到 JSON 对象中:我还没有测试过那个,但我确定应该可以。我可以调用“init”方法来遍历所有对象并使用所有 sql 字符串(删除、创建、截断等)创建该 JSON 对象/数组。


如果您能与我分享您对这些方法(优缺点)或其他更好解决方案的看法,我将不胜感激。


holdtom
浏览 93回答 1
1回答

30秒到达战场

正如评论中所指出的,这显然是一个糟糕的设计(这是一个我正在重构的旧项目)。所以我决定摆脱反思,花一些时间重新设计代码本身。我创建了一个基超类来处理所有类似的方法,并让实体/模型仅实现所需的单独规则,因此数据库访问仅作为单例存储在一个类中。使用接口多态性要好得多。通过这种方式,db 类处理动态 SQL 生成以避免在各处重复相同的代码并重新使用/回收实例列表以提高性能。观察。1:反射会降低性能,通常会让调试变得更加困难。当然它可以节省一些时间,因为它实现起来很快,但是会禁用大部分 IDE 功能,这使得它在大多数情况下毫无价值。观察。2:也不应该保持数据库实例列表处于活动状态。让许多实例同时访问数据库绝不是一个好主意,它会导致数据库锁定并重现意外问题。观察。3:那个 JSON 的东西……算了吧。我很抱歉提出如此丑陋的建议。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java