我无法宣布枚举.我正在尝试创建的是"DownloadType"的枚举,其中有3种下载类型(AUDIO,VIDEO,AUDIO_AND_VIDEO).
我已经实现了如下代码:
private enum DownloadType {
AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2);
private final int value;
private DownloadType(int value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我然后像这样使用它,这工作正常:
DownloadType.AUDIO_AND_VIDEO.value;
Run Code Online (Sandbox Code Playgroud)
但是,我希望它能让我不必要求"价值".我可能会弄错,但这是几个类在Java中工作的方式,比如Font,例如设置字体样式,你使用:
Font.PLAIN
Run Code Online (Sandbox Code Playgroud)
哪个返回一个int值,我们不使用:
Font.PLAIN.value
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 100
Font.PLAIN是不是一个枚举.这只是一个int.如果你需要从枚举中取出值,你就不能避免调用方法或使用a .value,因为枚举实际上是它自己类型的对象,而不是原语.
如果您真的只需要一个int,并且您已经接受了类型安全性丢失,用户可能会将无效值传递给您的API,您也可以将这些常量定义为int:
public final class DownloadType {
public static final int AUDIO = 0;
public static final int VIDEO = 1;
public static final int AUDIO_AND_VIDEO = 2;
// If you have only static members and want to simulate a static
// class in Java, then you can make the constructor private.
private DownloadType() {}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,该value字段实际上是多余的,因为还有一个.ordinal()方法,所以你可以定义enum为:
enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }
Run Code Online (Sandbox Code Playgroud)
并使用获得"价值"
DownloadType.AUDIO_AND_VIDEO.ordinal()
Run Code Online (Sandbox Code Playgroud)
编辑:更正了static classJava中不允许的代码.. 请参阅此SO答案,并提供有关如何在Java中定义静态类的说明和详细信息.
Per*_*ror 52
如果您需要获取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
}
Run Code Online (Sandbox Code Playgroud)
或者您可以简单地使用该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
Run Code Online (Sandbox Code Playgroud)
yon*_*joy 13
首先你应该问自己以下问题:你真的需要一个int吗?
枚举的目的是拥有一组项(常量),这些项在代码中具有意义而不依赖于外部值(如int).Java中的枚举可以用作切换器状态的参数,可以使用"=="等式运算符(以及其他)安全地进行比较.
建议1(无需int):
通常不需要背后的整数.
private enum DownloadType{
AUDIO, VIDEO, AUDIO_AND_VIDEO
}
Run Code Online (Sandbox Code Playgroud)
提案2(需要int):
然而,有时将枚举转换为int可能很有用(例如,如果外部API需要int值).在这种情况下,我建议使用toXxx()-Style 将方法标记为转换方法.用于打印覆盖toString().
DownloadType downloadType = MyObj.getDownloadType();
if (downloadType == DownloadType.AUDIO) {
//...
}
//or
switch (downloadType) {
case AUDIO: //...
break;
case VIDEO: //...
break;
case AUDIO_AND_VIDEO: //...
break;
}
Run Code Online (Sandbox Code Playgroud)
摘要
ordinal()获取枚举的整数,因为如果添加其他枚举常量或更改顺序,此值可能会更改.Ósc*_*pez 10
只需ordinal()在枚举值上调用方法,即可检索其对应的数字.不需要使用其值声明add属性,默认情况下每个枚举值都有自己的数字,从零开始分配,每个值按照它们声明的相同顺序递增1.
你不应该依赖于a的int值enum,只能依赖于它的实际值.Java中的枚举是一种不同的怪物,它不像C中的枚举,你依赖于它们的整数代码.
关于您在问题中提供的示例,Font.PLAIN因为它只是Font类的整数常量.如果你绝对需要(可能更改)数字代码,那么a enum不是正确的工具,更好地坚持数字常量.
您可以尝试此代码。
private enum DownloadType {
AUDIO , VIDEO , AUDIO_AND_VIDEO ;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此枚举是这样的:DownloadType.AUDIO.ordinal()。希望此代码段对您有所帮助。