まず、次の質問を自問する必要があります: 本当に int が必要ですか?
列挙型の目的は、外部値 (int など) に依存することなく、コード内で意味を持つアイテム (定数) のコレクションを持つことです。Java の列挙型は、switch ステートメントの引数として使用でき、"==" 等値演算子 (とりわけ) を使用して安全に比較できます。
提案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 が必要) :
それでも、enum を int に変換すると便利な場合があります (たとえば、外部 API が int 値を想定している場合)。toXxx()
この場合、 -Styleを使用してメソッドを変換メソッドとしてマークすることをお勧めします。オーバーライドの印刷用toString()
。
private enum DownloadType {
AUDIO(2), VIDEO(5), AUDIO_AND_VIDEO(11);
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.toInt()); //returns 2
System.out.println(DownloadType.AUDIO); //returns 2 via `toString/code`
System.out.println(DownloadType.AUDIO.ordinal()); //returns 0
System.out.println(DownloadType.AUDIO.name()); //returns AUDIO
System.out.println(DownloadType.VIDEO.toInt()); //returns 5
System.out.println(DownloadType.VIDEO.ordinal()); //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 11
概要
- 必要がない場合は、整数を列挙型と一緒に使用しないでください。
ordinal()
列挙型の整数を取得するために using に依存しないでください。順序を変更すると (値を挿入するなどして)、この値が変わる可能性があるためです。使用を検討している場合は、ordinal()
提案 1 を使用することをお勧めします。
- タイプセーフが失われるため、通常は列挙型の代わりにint定数を使用しないでください(受け入れられた回答のように)。