我見過this這是相當不錯的解決方案,如果我有一個字符串,而不是整數,但萬一我所擁有的是具體的枚舉的類對象和整數,如何做我得到具體的枚舉常量實例?從具有Class <?的整數獲取Enum擴展枚舉>對象
2
A
回答
1
似乎已經找到了答案:
((Class<? extends Enum>)clazz).getEnumConstants()[index]
雖然任何一找,你應該考慮以下@Daniel Pryden回答的最有可能的是,在大多數情況下,使用採用這種我能想到的是不好的做法。
1
依靠Java枚舉常量的序數值是不好的練習 - 它太容易意外地重新排序它們,然後會破壞你的代碼。更好的解決方案是簡單地提供自己的整數,你可以改用:
public enum MyThing {
FOO(1),
BAR(2),
BAZ(3);
private final int thingId;
private MyThing(int thingId) {
this.thingId = thingId;
}
public int getThingId() {
return thingId;
}
}
然後,每當你想從MyThing
得到thingId
,只需調用getThingId()
方法:
void doSomething(MyThing thing) {
System.out.printf("Got MyThing object %s with ID %d\n",
thing.name(), thing.getThingId());
}
如果您希望能夠通過其thingId
查找MyThing
,您可以自己構建查找表並將其存儲在static final
字段中:
private static final Map<Integer, MyThing> LOOKUP
= createLookupMap();
private static Map<Integer, MyThing> createLookupMap() {
Map<Integer, MyThing> lookupMap = new HashMap<>();
for (MyThing thing : MyThing.values()) {
lookupMap.put(thing.getThingId(), thing);
}
return Collections.unmodifiableMap(lookupMap);
}
public static MyThing getThingById(int thingId) {
MyThing result = LOOKUP.get(thingId);
if (result == null) {
throw new IllegalArgumentException(
"This is not a valid thingId: " + thingId);
}
return result;
}
如果你最終有很多枚舉類的,你想做的事與他們每個人的類似的事情,你可以定義一個接口爲:
public interface Identifiable {
int getId();
}
然後進行枚舉實現該接口:
public enum MyThing implements Identifiable {
...
@Override
public int getId() {
return thingId;
}
}
然後你就可以建立用於查找基於其ID的Identifiable
對象可重複使用的機制。
相關問題
- 1. 爲什麼所有的枚舉擴展Enum <e>
- 2. Java枚舉:列出Class <?中的枚舉值擴展枚舉>
- 3. 從類<?獲取枚舉實例擴展枚舉>使用字符串值?
- 4. Enum <?擴展接口>
- 5. 枚舉之間的區別<?擴展ZipEntry>和枚舉<ZipEntry>?
- 6. 從map <String,Table <?獲取具有未知泛型參數的對象擴展實體>>
- 7. <?>與<?擴展對象>
- 8. 爲什麼<T擴展Enum <T>&SomeInterface>編譯,但不是<T擴展SomeInterface&Enum <T>>?
- 9. 擴展枚舉
- 10. 我想擴展枚舉和對象(generic)
- 11. 擴展枚舉
- 12. 「擴展」枚舉
- 13. 從Java類擴展與<class name>
- 14. Java:從枚舉枚舉<String>
- 15. IEnumerable的擴展方法<Enum>?
- 16. 擴展枚舉?
- 17. 擴展枚舉類
- 18. 枚舉結構和枚舉類有什麼區別?在<a href="http://en.cppreference.com/w/cpp/language/enum" rel="nofollow"><code>enum</code> documentation</a>
- 19. 加載YAML燈具的地圖<枚舉,整數>
- 20. 從枚舉中獲取整數值
- 21. 獲取枚舉從一類具有多個枚舉
- 22. 檢入對象instanceof Class <?擴展Object2>
- 23. #define枚舉或如何擴展枚舉
- 24. 從可枚舉<int>
- 25. 用Java Enum模擬C++枚舉整數
- 26. 從$ .get()對象的<body>獲取「class」attr
- 27. 泛型和類<?擴展Enum <?>>,EnumSet.allOf(類)與class.getEnumConstants()
- 28. 準備enum列表並從列表中找到枚舉值<enum>
- 29. 如何在Scala中擴展現有的枚舉對象?
- 30. 枚舉所有SomeClass <T>所有對象T
請注意,我不知道哪種類型是我的枚舉,並且它甚至可能不是我自己寫的枚舉,我只在運行時擁有類類型,我必須能夠處理它,所以您的答案是無辜的抱歉...無論如何。 –
@OfekRon:這是一個不尋常的要求。你究竟想要做什麼?另外:請注意,這個答案不僅適用於您,也適用於正在搜索互聯網並找到您的問題的未來人士。即使這個答案對你來說「不相關」,也可能與其他人有關。 –
不要以錯誤的方式,我沒有投票,因爲它是一個很好的答案,但它不是正確的答案,因此它不會被標記爲正確的。我正在寫一個使用反射的數據庫幫助程序,所以我不能假設所有我得到的枚舉都是由我寫的,或者正在實現我的接口。 –