返回 Int

我在声明枚举时遇到了麻烦。我试图创建的是一个“ 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
211032 次浏览

如果需要获取 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

PLAIN 没有一个枚举。这只是一个 int。如果需要从枚举中提取值,则不能避免调用方法或使用 .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() {}
}

顺便说一下,value字段实际上是多余的,因为还有一个 .ordinal()方法,所以您可以将 enum定义为:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

使用

DownloadType.AUDIO_AND_VIDEO.ordinal()

Edit: Corrected the code.. static class is not allowed in Java. See 这么回答 with explanation and details on how to define static classes in Java.

只需对枚举值调用 ordinal()方法,就可以检索其对应的数字。没有必要用它的值声明一个加法属性,默认情况下,每个枚举值都有自己的数字,从零开始分配,每个值按声明的顺序递增一个。

您不应该依赖于 enumint值,而应该只依赖于它的实际值。Java 中的枚举是一种不同的怪物,与 C 中的枚举不同,C 中的枚举依赖于它们的整数代码。

关于您在问题中提供的示例,Font.PLAIN可以工作,因为它只是 Font 类的一个整数常量。如果您绝对需要一个(可能正在更改的)数值代码,那么 enum不是完成此任务的正确工具,最好坚持使用数值常量。

如果要将枚举与字符串连接起来,可以重写 toString 方法以返回 int:

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

然后你可以简单地使用:

String something = "foo" + DownloadType.AUDIO;

并且将调用 toString ()方法。


请注意,以编程方式使用 toString ()通常被认为是不好的做法——它只适用于人类的眼睛,但这是实现您所要求的目标的唯一方法。

首先,你应该问自己下面的问题: 你真的需要一个整型数吗?

枚举的目的是拥有一个项(常量)的集合,这些项在代码中具有意义,而不依赖于外部值(如 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 可能是有用的(例如,如果外部 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

摘要

  • 如果没有必要,不要将 Integer 与枚举一起使用。
  • 不要依赖于使用 ordinal()来获取枚举的整数,因为如果更改顺序(例如通过插入值) ,该值可能会更改。如果您正在考虑使用 ordinal(),那么最好使用建议1。
  • 通常不要使用 int 常量代替枚举(就像在已接受的答案中那样) ,因为这样会失去类型安全性。

你可以试试这个代码。

private enum DownloadType {
AUDIO , VIDEO , AUDIO_AND_VIDEO ;


}

您可以像这样使用这个枚举: DownloadType.AUDIO.ordinal()。希望这个代码片段可以帮助您。

你想要这个密码吗?

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());
}

在我看来,最可读的版本

public enum PIN_PULL_RESISTANCE {
PULL_UP {
@Override
public int getValue() {
return 1;
}
},
PULL_DOWN {
@Override
public int getValue() {
return 0;
}
};


public abstract int getValue();
}