【问题标题】:Dynamically Selecting Fields from Java Objects从 Java 对象中动态选择字段
【发布时间】:2012-10-04 13:19:08
【问题描述】:

我有一个 Java 对象,它表示数据库的内容,如下所示:

public Database {
    int varA;
    String varB;
    double varC;
}

现在我正在尝试选择和排序某些元素以进行处理,但我想让它可配置,所以我创建了一个枚举,它代表对象的所有属性,例如

public enum Contents {
    VarA,
    VarB,
    VarC;
}

所以现在当我创建一个像这样的选择时

Contents[] select = { Contents.VarC, Contents.VarB };

我想从中生成一个代表实际数据库内容的字符串值列表。现在我能想到的唯一实现是切换选择中的每个条目,具有非常丑陋的二次复杂度......

public List<String> switchIT(Database db, Contents[] select) {
    List<String> results = new ArrayList<String>();

    for (Contents s : select) {
        switch(s) {
            case VarA:
                results.add(db.varA.toString());
                break;
            //go on...
        }
    }

    return results;
}

有没有更直接的方式在枚举和动态对象值之间进行映射? 或者更笼统地说:从对象中动态选择值的最佳方式是什么?

【问题讨论】:

    标签: java database select enums


    【解决方案1】:

    利用 Java 枚举的强大功能,它们是成熟的类。

    public enum Contents {
      VarA { public String get(Database d) { return d.getVarA(); } },
      VarB { public String get(Database d) { return d.getVarB(); } },
      VarC { public String get(Database d) { return d.getVarC(); } };
      public String get(Database d) { return ""; }
    }
    

    你的客户端代码就变成了

    public List<String> switchIT(Database db, Contents[] select) {
      List<String> results = new ArrayList<String>();
      for (Contents s : select) results.add(s.get(db));
      return results;
    }
    

    更简洁但更慢的解决方案是使用基于反射的get 的单个实现,并使用枚举成员的名称来生成适当的getter 名称:

    public enum Contents {      
      VarA, VarB, VarC;
    
      private final Method getter;
    
      private Contents() {
        try {
          this.getter = Database.class.getMethod("get"+name());
        } catch (Exception e) { throw new RuntimeException(e); }
      }
      public String get(Database d) {
        try {
          return (String) getter.invoke(d); 
        } catch (Exception e) { throw new RuntimeException(e); }
      }
    }
    

    【讨论】:

    • 嗯,我知道有这样一个简单的方法^^
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多