[英]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.