2011-03-21 144 views

回答

58

你不能設置它。它始終是不變定義的序數。看到documentation for Enum.ordinal()

返回枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。

實際上 - 你不應該需要。如果你想要一些整數屬性,請定義一個。

+5

如果我可以指定枚舉的順序,當使用JPA用枚舉,那將是更安全... – 2011-03-21 14:18:41

75

您可以通過更改枚舉的順序來控制序號,但不能像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

+7

+1除了這個ISN真的是一種解決方法。這是理想的行爲。序數值被認爲是實現人工產物;如果你想分配一個整數或其他值,這就是「枚舉是clases」是如此之大... – andersoj 2011-03-21 01:43:24

+1

wouldnt BAR.ordinal()返回0 afaik枚舉索引是零基於 – Terraego 2012-03-10 14:59:41

+0

@Terraego良好的捕獲。 – Matt 2012-03-14 04:33:42

2

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

公共最終詮釋序()返回此枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。

返回: 枚舉常量的序

如果你有

公共枚舉日{ 週日,週一,週二,週三, 週四,週五,週六 }

然後SUNDAY的序數爲0,MONDAY爲1,依此類推...

+3

不能保證上面的順序! – claj 2014-01-10 14:02:44

+1

@claj,你可以擴展一下嗎?文件似乎表明它確實如此。 – Celos 2014-08-26 13:01:49

+0

對不起@Celos,第一枚枚舉的確是0,但規範並沒有提到除了單調遞增之外應如何賦值。我認爲我在Effective Java等方面閱讀了一些關於此警告的內容,但不要聽我的話。 – claj 2014-08-26 13:55:53

0

檢查出的Java Enum examplesdocs

返回枚舉常數的序(它在枚舉聲明,其中初始常量被分配的零序位置)。大多數程序員將無法使用這種方法。它設計用於複雜的基於枚舉的數據結構,如EnumSet和EnumMap。

-2

簡單的答案:只是改變常量的順序。第一個定義爲0,第二個定義爲1,等等。但是,如果你經常更改代碼,或者枚舉會有許多值,這可能不太實際。您可以定義一個自定義方法來解決默認序號問題,但請確保它有充分的文檔記錄以避免混淆!

public enum Values 
{ 
    ONE, TWO, THREE, FOUR; 

    public int getCustomOrdinal() 
    { 
     if(this == ONE) 
     { 
      return 3; 
     } 
     else if(this == TWO) 
     { 
      return 0; 
     } 
     ... 
    } 
} 
+4

+1:switch語句可能比一系列if-else語句更好。 – 2011-03-21 07:44:00

+4

我不喜歡這個解決方案。枚舉是類,因此可以包含自定義屬性。我寧願爲這個和相應的getter方法定義一個字段。 – Atmocreations 2014-05-21 09:04:04

+0

這是一般較好的解決方案。但問題是否有可能改變ordinal()的行爲... – donnyton 2014-09-05 20:46:58

4

您可以使用反射更新序號:

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); 
    } 
} 
1

由於接受的答案指出,你不能設置序號。你可以得到這個最接近的是自定義屬性

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; 
    } 

} 
相關問題