2012-10-14 76 views
0

我有在Java中表示数据库的内容的对象,像这样:动态从Java选择字段对象

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

现在我试图选择与秩序forther处理某些元素,但我希望把它配置的,所以我创建了代表像

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; 
} 

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

回答

3

使用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并使用枚举成员的名称,以产生适当的吸气剂名称:

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); } 
    } 
} 
+0

嗯,我知道有这样一个简单的方法^^ – Klamann