是否有类似C的方式从java中的枚举中获取项目编号?

Perhap这是一个简单的基本问题

有一个枚举

public enum TK{ ID,GROUP,DATA,FAIL; } 

我可以获得订单号,例如ID = 0,GROUP = 2,DATA = 3,FAIL = 4?

这是一种方法,但一个奇怪而漫长的方式! = S

 public enum TK{ ID(0),GROUP(1),DATA(2),FAIL(3); int num; TK(int n) { this.num=n; } public int get() { return num; } }; 

得到数字所以我写TK.ID.get(),TK.GROUP.get()等…我不喜欢那样

有一个更好的方法?

(C enums,C macros ..我想念你们两个)

谢谢

你在寻找序数吗?

ordinal()做你想做的事。 这是文档的摘录:

返回此枚举常量的序数(它在enum声明中的位置,其中初始常量的序数为零)。 大多数程序员都没有使用这种方法。 它设计用于复杂的基于枚举的数据结构,例如EnumSetEnumMap

有效Java第2版中的 Josh Bloch进一步解释了为什么使用ordinal()是一个糟糕的主意。 以下是一些引用,略有编辑:

永远不要从序数中得出与枚举相关的值; 将其存储在实例字段中。 ( 第31项:使用实例字段而不是序数 )使用序数来索引数组很少是合适的:改为使用EnumMap 。 一般原则是应用程序员很少(如果有的话)使用Enum.ordinal 。 ( 第33项:使用EnumMap而不是序数索引

你的“奇怪和漫长”的方式恰恰是第31项的处方。

幸运的是 ,Java不是C.一个Java enum非常强大和灵活,由许多库类支持,你应该学会拥抱它们而不是使用ordinal()

EnumMap为例。

用于enum类型键的专用Map实现。 enum映射中的所有键必须来自创建映射时显式或隐式指定的单个enum类型。 枚举映射在内部表示为数组。 这种表现非常紧凑和高效。

也就是说,而不是以下(这可能是你想要做的):

 T[] arr = ...; TK tk = ...; T something = ...; arr[tk.ordinal()] = something; 

你可以这样做:

 Map map = new EnumMap(TK.class); TK tk = ...; T something = ...; map.put(tk, something); 

本书还介绍了C中enum另一种“传统”(ab)用法,即位域(为每个常量赋予2的幂等)。 好吧,因为Java有EnumSet

你可以使用序数()

http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal()

public final int ordinal()
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。 大多数程序员都没有使用这种方法。 它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。