首先你應該問自己以下問題:你真的需要一個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提到的那樣)。
您可以簡單地使用DownloadType。AUDIO_AND_VIDEO也除非你需要價值,我錯過了什麼? – kosa
@Nambari如果我System.out.println(DownloadType.AUDIO_AND_VIDEO)它返回「AUDIO_AND_VIDEO」這顯然是'DownloadType'類型,而不是int。 – Cristian
我認爲你混淆了枚舉的目的。你爲什麼還需要整數? – Jivings