我无法宣布枚举。我正在尝试创建的是“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;
}
}
如果我像这样使用它,这可以正常工作:
DownloadType.AUDIO_AND_VIDEO.value;
然而,我希望它能让我不必要求'价值'。我可能会弄错,但这是几个类在Java中工作的方式,比如Font,例如设置字体样式,你使用:
Font.PLAIN
返回一个int值,我们不使用:
Font.PLAIN.value
答案 0 :(得分:93)
Font.PLAIN 不枚举。它只是一个int
。如果你需要从枚举中取出值,你就不能避免调用方法或使用.value
,因为枚举实际上是它自己类型的对象,而不是原语。
如果您真的只需要int
,和,那么您已经接受了类型安全性丢失,用户可能会将无效值传递给您的API,可能< / em>将这些常量定义为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() {}
}
顺便说一下,value
字段实际上是多余的,因为还有.ordinal()
方法,因此您可以将enum
定义为:
enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }
并使用
获取“值”DownloadType.AUDIO_AND_VIDEO.ordinal()
编辑:更正了代码.. Java中不允许使用static class
。请参阅this SO answer,其中包含有关如何使用Java定义静态类的说明和详细信息。
答案 1 :(得分:47)
如果您需要获取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 :(得分:12)
首先你应该问自己以下问题:你真的需要一个int吗?
枚举的目的是拥有一组项(常量),这些项在代码中具有意义而不依赖于外部值(如int)。 Java中的枚举可以用作切换器状态的参数,可以使用&#34; ==&#34;来安全地进行比较。平等操作员(等等)。
提案1(无需任何内容):
通常不需要在它后面有一个整数,然后只需使用它:
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()
- 样式将方法标记为转换方法。用于打印覆盖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()
来获取枚举的整数,因为如果更改顺序(例如通过插入值),此值可能会更改。如果您考虑使用ordinal()
,最好使用提案1。答案 3 :(得分:10)
只需在枚举值上调用ordinal()
方法,即可检索其对应的数字。没有必要使用其值声明add属性,默认情况下每个枚举值都有自己的数字,从零开始分配,每个值按照它们声明的相同顺序递增1。
您不应仅依赖int
的{{1}}值,而只取决于其实际值。 Java中的枚举是一种不同的怪物,它不像C中的枚举,你依赖于它们的整数代码。
关于您在问题中提供的示例,enum
有效,因为它只是Font类的整数常量。如果您绝对需要(可能更改)数字代码,那么Font.PLAIN
不适合作业,更好地坚持数字常量。
答案 4 :(得分:4)
您可以尝试使用此代码。
private enum DownloadType {
AUDIO , VIDEO , AUDIO_AND_VIDEO ;
}
您可以使用此枚举:DownloadType.AUDIO.ordinal()
。希望这段代码片段对您有所帮助。
答案 5 :(得分:3)
如果使用字符串连接枚举,可以覆盖toString方法以返回int:
public String toString() {
return value + "";
}
然后你可以简单地使用:
String something = "foo" + DownloadType.AUDIO;
将调用toString()方法。
请注意,以编程方式使用toString()通常被认为是不好的做法 - 它仅供人眼使用,但这是实现您所要求的唯一方法。
答案 6 :(得分: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());
}
答案 7 :(得分:2)
我认为最易读的版本
DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(
color: Colors.deepPurple
),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
setState(() {
dropdownValue = newValue;
});
},
items: <String>['One', 'Two', 'Free', 'Four']
.map<DropdownMenuItem<String>>((String value) {
return ListTile(
onTap: () {},
leading: CircleAvatar(backgroundColor: Colors.primaries[0]),
title: Text(value),
);
})
.toList(),