2013-10-23 47 views
-1

我有一個類CarField名爲trunk。我如何才能僅使用分配給它的屬性檢索該名稱,並且沒有任何固定的String。 做某件事情是這樣的小說將是巨大的:如何獲取屬性的字符串名稱?

System.out.println(new Car().getTrunk().getField().getName()); 

輸出:

trunk 

我不想使用一個固定String檢索Field和它的名字,因爲這將不重構好。如果我決定從trunk重命名爲boot,我希望這可以通過我的IDE重構工具完全處理。

UPDATE Car類:

public class Car{ 
    String trunk; 
    // getters + setters 
} 

背景:
我想用Primefaces' Dynamic Columns一個CRUD的UI幾個實體,它使用一個columnTemplate containig的Field S /屬性的名稱進行評估通過Expression Language

+0

你可以請出示你的'汽車'類嗎? – Vallentin

+7

查找反射。 – Doorknob

+1

http://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html –

回答

0

考慮汽車引入枚舉保持的所有屬性(沒有值),例如

enum CarProperty { 
TRUNK, HOOD, WHATEVER; 
} 

,並將它們存儲作爲EnumMap的:

class Car { 
private Map<CarProperty, String> propsToValues = new EnumMap<>(...); 
public String getValue(CarProperty property) { ... } 
} 

屬性名稱可以通過

訪問
((CarProperty) anyPropery).toString() 

而且顯然很容易重構

+0

謝謝你的努力。但這真是一個醜陋的解決方法。想象一下,在一個真正的項目中有很多類可以使用它。 – Lester

+0

@Lester同意,但正如omarhry所言,你想要做的是打破總是醜陋的OOP原則。 – TheWonderBird

+0

@順便說一句,如果你使用Intellij Idea重構你的代碼,它會建議你更新getter和setter以及其他相關的代碼。也許這會有所幫助。 – TheWonderBird

0

訪問屬性名稱不是一個好主意。 有了反思,你正在破壞面向對象的原則。

getTrunk()不是八方通需要訪問一個行李箱財產

你可以有一個

private Trunk trunk;//remember to change the TRUNK_FIELD 
public static final TRUNK_FIELD = "trunk" 

,但...儘量避免這種情況的解決方案。

+0

謝謝你的回答,但我看不出這會如何重構。 – Lester

+0

編輯:使用公共TRUNK_FILED,並且當您重構中繼線變量時,也更改「中繼線」。那不解決你的問題? –

相關問題