ordinal()
方法返回枚舉實例的序號。
如何設置枚舉的序號?我可以在Java中爲枚舉指定序號嗎?
回答
你不能設置它。它始終是不變定義的序數。看到documentation for Enum.ordinal():
返回枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。
實際上 - 你不應該需要。如果你想要一些整數屬性,請定義一個。
您可以通過更改枚舉的順序來控制序號,但不能像C++
那樣顯式設置它。一個解決辦法是你想要的號碼提供額外的方法,在您的枚舉:
enum Foo {
BAR(3),
BAZ(5);
private final int val;
private Foo(int v) { val = v; }
public int getVal() { return val; }
}
在這種情況下BAR.ordinal() == 0
,但BAR.getVal() == 3
。
從http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html
公共最終詮釋序()返回此枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。
返回: 枚舉常量的序
如果你有
公共枚舉日{ 週日,週一,週二,週三, 週四,週五,週六 }
然後SUNDAY的序數爲0,MONDAY爲1,依此類推...
檢查出的Java Enum examples和docs
返回枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。
簡單的答案:只是改變常量的順序。第一個定義爲0,第二個定義爲1,等等。但是,如果你經常更改代碼,或者枚舉會有許多值,這可能不太實際。您可以定義一個自定義方法來解決默認序號問題,但請確保它有充分的文檔記錄以避免混淆!
public enum Values
{
ONE, TWO, THREE, FOUR;
public int getCustomOrdinal()
{
if(this == ONE)
{
return 3;
}
else if(this == TWO)
{
return 0;
}
...
}
}
+1:switch語句可能比一系列if-else語句更好。 – 2011-03-21 07:44:00
我不喜歡這個解決方案。枚舉是類,因此可以包含自定義屬性。我寧願爲這個和相應的getter方法定義一個字段。 – Atmocreations 2014-05-21 09:04:04
這是一般較好的解決方案。但問題是否有可能改變ordinal()的行爲... – donnyton 2014-09-05 20:46:58
您可以使用反射更新序號:
private void setEnumOrdinal(Enum object, int ordinal) {
Field field;
try {
field = object.getClass().getSuperclass().getDeclaredField("ordinal");
field.setAccessible(true);
field.set(object, ordinal);
} catch (Exception ex) {
throw new RuntimeException("Can't update enum ordinal: " + ex);
}
}
由於接受的答案指出,你不能設置序號。你可以得到這個最接近的是自定義屬性:
public enum MonthEnum {
JANUARY(1),
FEBRUARY(2),
MARCH(3),
APRIL(4),
MAY(5),
JUNE(6),
JULY(7),
AUGUST(8),
SEPTEMBER(9),
OCTOBER(10),
NOVEMBER(11),
DECEMBER(12);
MonthEnum(int monthOfYear) {
this.monthOfYear = monthOfYear;
}
private int monthOfYear;
public int asMonthOfYear() {
return monthOfYear;
}
}
- 1. 我可以在枚舉中聲明枚舉以指定/限制Java中的映射中的鍵和值嗎?
- 2. 我可以在枚舉中使用枚舉嗎?
- 3. 在Java中可以枚舉具有不等號的名稱嗎?
- 4. 我可以在Java中設置枚舉啓動值嗎?
- 5. 我們可以在java中使用C++類型枚舉嗎?
- 6. 我可以在Razor視圖中定義一個枚舉嗎?
- 7. 我可以使用@switch和枚舉嗎?
- 8. MySQL:我可以共享枚舉嗎?
- 9. 我可以比較MySQL枚舉嗎?
- 10. 我可以使用參數枚舉嗎?
- 11. 我可以枚舉JRuby中Java接口的實例方法嗎?
- 12. SystemVerilog枚舉可以爲null嗎?
- 13. 我可以用位或對Java枚舉
- 14. 我們可以在函數內部定義枚舉嗎?
- 15. 我怎麼可以參考我的Java枚舉沒有指定其類型
- 16. 在Rhino中,我可以枚舉可用的Java包的列表嗎?怎麼樣?
- 17. 我可以迭代多維枚舉(java)嗎?
- 18. 我們可以改變datomic枚舉嗎?或者我們可以添加任何新的值給datomic枚舉嗎?
- 19. 是否可以在C++ 11中指定枚舉的位寬?
- 20. 我可以在JpaRepository nativeQuery中使用枚舉參數嗎?
- 21. 我可以配置ServiceStack.Text以將枚舉值序列化爲camelCase嗎?
- 22. 我可以在枚舉上使用gcc可見性屬性嗎?
- 23. 我可以傳遞和使用枚舉作爲變量嗎?
- 24. 我可以使用枚舉作爲ConverterParameter嗎?
- 25. .NET 3.5中有可能指定一個枚舉類型嗎?
- 26. java枚舉ArrayList - 這可能嗎?
- 27. Java:我可以使用常量字符串作爲枚舉鍵值嗎?
- 28. Java在枚舉中的枚舉
- 29. 我可以在枚舉中嵌套類,並在枚舉中創建ArrayList?
- 30. 我可以在css中指定maxlength嗎?
如果我可以指定枚舉的順序,當使用JPA用枚舉,那將是更安全... – 2011-03-21 14:18:41