是否有类似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
声明中的位置,其中初始常量的序数为零)。 大多数程序员都没有使用这种方法。 它设计用于复杂的基于枚举的数据结构,例如EnumSet
和EnumMap
。
有效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
。
你可以使用序数()
tk.ordinal()
是tk
是TK
实例的方法
http://java.sun.com/javase/6/docs/api/index.html?java/lang/Enum.html#ordinal()
http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal()
public final int ordinal()
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。 大多数程序员都没有使用这种方法。 它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。