簡體   English   中英

從Java對象動態選擇字段

[英]Dynamically Selecting Fields from Java Objects

我有一個用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枚舉的強大功能,它們是成熟的類。

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的單個實現,並使用enum成員的名稱來生成適當的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); }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM