2012-12-09 126 views
54

我無法聲明枚舉。我想創建的是一個'DownloadType'的枚舉,其中有3種下載類型(AUDIO,VIDEO,AUDIO_AND_VIDEO)。Java枚舉返回Int

我已經實現的代碼如下:

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 
} 

這工作得很好,如果我再這樣使用它:

DownloadType.AUDIO_AND_VIDEO.value; 

不過,我想它讓我沒有要求「價值」。我可能是錯了,但這是這樣幾類在Java中工作,如字體,例如設置字體樣式,可以使用:

Font.PLAIN 

返回一個int值,我們不使用:

Font.PLAIN.value 
+1

您可以簡單地使用DownloadType。AUDIO_AND_VIDEO也除非你需要價值,我錯過了什麼? – kosa

+0

@Nambari如果我System.out.println(DownloadType.AUDIO_AND_VIDEO)它返回「AUDIO_AND_VIDEO」這顯然是'DownloadType'類型,而不是int。 – Cristian

+2

我認爲你混淆了枚舉的目的。你爲什麼還需要整數? – Jivings

回答

86

Font.PLAIN枚舉。這只是一個int。如果您需要從枚舉中取出值,則無法避免調用方法或使用.value,因爲枚舉實際上是它自己類型的對象,而不是基元。

如果你真的只需要一個int你已經接受類型安全丟失,用戶可以通過無效的值到你的API,你可能定義這些常量int也:

static class DownloadType { 
    public static final int AUDIO = 0; 
    public static final int VIDEO = 1; 
    public static final int AUDIO_AND_VIDEO = 2; 
} 

順便說一句,在value場實際上是多餘的,因爲還有一個.ordinal()方法,這樣你就可以定義爲enum

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO } 

,並獲得「價值」使用

DownloadType.AUDIO_AND_VIDEO.ordinal() 
+0

感謝澄清,這是現在有道理。我將創建一個公共的DownloadType {private static final int AUDIO = 0; } ...這應該是一個InnerClass?感謝您的回答。 – Cristian

+0

@克里斯蒂安:它主要取決於你想如何訪問它。 – kennytm

+0

感謝您的回答,正是我所期待的 - 等待3分鐘即可接受 – Cristian

38

如果你需要得到int值,就必須對您的ENUM值一個getter:

private enum DownloadType { 
    AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

public static void main(String[] args) { 
    System.out.println(DownloadType.AUDIO.getValue());   //returns 1 
    System.out.println(DownloadType.VIDEO.getValue());   //returns 2 
    System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3 
} 

,或者你可以簡單的使用ordinal()方法,它會返回枚舉的位置合作在枚舉中立即。

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    //rest of the code 
} 

System.out.println(DownloadType.AUDIO.ordinal());   //returns 0 
System.out.println(DownloadType.VIDEO.ordinal());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2 
+2

爲什麼你只需要調用.value就需要額外的方法,並且已經有了一個方法ordinal()來獲取整數。 – kosa

+0

@Nambari嗯,力德知道枚舉有序..多麼愚蠢的我:P – PermGenError

+0

@GanGnaMStYleOverFlowErroR感謝您的答案,但我實際上是希望避免調用.value,更不用說創建另一種方法並調用getValue():) – Cristian

10

簡單地調用一個枚舉值ordinal()方法,以獲取其相應的編號。沒有必要用它的值聲明一個附加屬性,每個枚舉值在默認情況下都會獲得自己的編號,從0開始分配,每個值按照它們聲明的相同順序遞增1。

您不應該依賴於enumint值,只能根據其實際值。 Java中的枚舉是一種不同類型的怪物,並不像C中的枚舉,因爲它依賴於它們的整數代碼。

關於您在問題中提供的示例,Font.PLAIN的工作原理是因爲它只是Font類的整數常量。如果您絕對需要(可能更改)數字代碼,那麼enum不適合工作,更好地堅持數字常量。

+1

我知道ordinal(),但如果我以後要更改或指定不同的順序,這會導致問題。我想指定int值 – Cristian

+1

@Cristian你不應該依賴枚舉的int值,只能依賴於它的實際值。 Java中的枚舉不像C中的枚舉,你依賴它們的整數代碼。 –

+0

@Cristian,並且關於您在「Font.PLAIN」問題中提供的示例,因爲這只是Font類的整數常量。如果你絕對需要一個(可能改變的)數字代碼,那麼'enum'不是工作的正確工具,更好地堅持數字常量。 –

3

如果您連接具有一個字符串,您可以覆蓋toString方法枚舉返回INT:

public String toString() { 
    return value + ""; 
} 

然後,你可以簡單地使用:

String something = "foo" + DownloadType.AUDIO; 

和toString()方法將被調用。


請注意,以編程方式使用toString()通常被認爲是很差的練習 - 它僅適用於人眼,但這是實現您要求的唯一方法。

+0

偉大的解決方法,謝謝! – Cristian

10

首先你應該問自己以下問題:你真的需要一個int嗎?

枚舉的目的是有一個項目(常量)的集合,這些項目在代碼中具有含義而不依賴於外部值(如int)。 Java中的枚舉可以用作開關語句的參數,並且可以使用「==」相等運算符(等等)安全地進行比較。

提案1(無INT需要):

通常沒有必要對其背後的整數。

private enum DownloadType{ 
    AUDIO, VIDEO, AUDIO_AND_VIDEO 
} 

//... 

DownloadType downloadType = MyObj.getDownloadType(); 
if (downloadType == DownloadType.AUDIO) { 
    //... 
} 
//or 
switch (downloadType) { 
    case AUDIO: //... 
      break; 
    case VIDEO: //... 
      break; 
    case AUDIO_AND_VIDEO: //... 
      break; 
} 

提案2(INT需要):

然而有時也可能是有用的一個枚舉轉換爲int(例如,如果一個外部API期望INT值)。在這種情況下,我建議將方法標記爲使用toXxx()Style的轉換方法。用於打印覆蓋toString()

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int code; 

    private DownloadType(int code) { 
     this.code = code; 
    } 

    public int toInt() { 
     return code; 
    } 

    public String toString() { 
     //only override toString, if the returned value has a meaning for the 
     //human viewing this value 
     return String.valueOf(code); 
    } 
} 

System.out.println(DownloadType.AUDIO);     //returns 0 
System.out.println(DownloadType.AUDIO.name());   //returns AUDIO 
System.out.println(DownloadType.VIDEO.toInt());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2 

摘要

  • 不要連同枚舉,如果你沒有使用一個整數。
  • 不要依賴使用ordinal()獲取枚舉的整數,因爲如果添加其他枚舉常量或更改順序,此值可能會更改。
  • 通常不要使用int常量而不是枚舉(就像在接受的答案中一樣),因爲你會失去類型安全性(就像@KennyTM提到的那樣)。
+0

+1指向'toString()'雖然int變成了一個字符串,我不打算使用它,因爲:) –

4

您可以試試這段代碼。

private enum DownloadType { 
    AUDIO , VIDEO , AUDIO_AND_VIDEO ; 

} 

您可以像這樣使用此枚舉:DownloadType.AUDIO.ordinal()。希望這段代碼能幫助你。

3

你是否想要這樣的代碼?

public static enum FieldIndex { 
    HDB_TRX_ID,  //TRX ID 
    HDB_SYS_ID  //SYSTEM ID 
} 

public String print(ArrayList<String> itemName){ 
    return itemName.get(FieldIndex.HDB_TRX_ID.ordinal()); 
}