为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2023-03-17 15:08:52
你好吗?我正在尝试执行一些动态方法调用以获取 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 对象/数组。如果您能与我分享您对这些方法(优缺点)或其他更好解决方案的看法,我将不胜感激。
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

正如评论中所指出的,这显然是一个糟糕的设计(这是一个我正在重构的旧项目)。所以我决定摆脱反思,花一些时间重新设计代码本身。

我创建了一个基超类来处理所有类似的方法,并让实体/模型仅实现所需的单独规则,因此数据库访问仅作为单例存储在一个类中。使用接口多态性要好得多。

通过这种方式,db 类处理动态 SQL 生成以避免在各处重复相同的代码并重新使用/回收实例列表以提高性能。

观察。1:反射会降低性能,通常会让调试变得更加困难。当然它可以节省一些时间,因为它实现起来很快,但是会禁用大部分 IDE 功能,这使得它在大多数情况下毫无价值。

观察。2:也不应该保持数据库实例列表处于活动状态。让许多实例同时访问数据库绝不是一个好主意,它会导致数据库锁定并重现意外问题。

观察。3:那个 JSON 的东西……算了吧。我很抱歉提出如此丑陋的建议。


查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信