2012-10-14 128 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