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 ..我想念你们两个人)
感谢
答案 0 :(得分:14)
ordinal()
做了你想做的事。这是文档的摘录:
Effective Java 2nd Edition 中的Josh Bloch进一步解释了为什么使用返回此枚举常量的序数(它在
enum
声明中的位置,其中初始常量的序数为零)。 大多数程序员都不会使用此方法。它专为复杂的基于枚举的数据结构而设计,例如EnumSet
和EnumMap
。
ordinal()
是一个糟糕的主意。以下是一些引用,略有编辑:
永远不要从序数中获取与枚举相关的值;将其存储在实例字段中。 (第31项:使用实例字段而不是序数)使用序数来索引数组很少是合适的:使用
EnumMap
代替。一般原则是应用程序员很少(如果有的话)使用Enum.ordinal
。 (第33项:使用EnumMap
代替有序索引)
你的“奇怪而漫长”的方式恰恰是第31项的处方。
幸运的是,Java不是C. Java enum
非常强大和灵活,受到许多库类的支持,你应该学会拥抱它们而不是使用{{1} }。
例如,请查看EnumMap
。
用于
ordinal()
类型键的专用Map
实现。enum
映射中的所有键必须来自创建映射时显式或隐式指定的单个enum
类型。枚举映射在内部表示为数组。这种表现非常紧凑和高效。
也就是说,而不是以下(也许你想做的事):
enum
您可以改为:
T[] arr = ...;
TK tk = ...;
T something = ...;
arr[tk.ordinal()] = something;
本书还介绍了C中Map<TK,T> map = new EnumMap<TK,T>(TK.class);
TK tk = ...;
T something = ...;
map.put(tk, something);
的另一种“传统”(ab)用法,即位域(为每个常量赋予2的幂等)。好吧,因为Java改为EnumSet
。
答案 1 :(得分:7)
您在寻找ordinal吗?
答案 2 :(得分:2)
您可以使用ordinal()
答案 3 :(得分:2)
tk.ordinal()
是在tk
是TK
http://java.sun.com/javase/6/docs/api/index.html?java/lang/Enum.html#ordinal()
答案 4 :(得分:1)
http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal()
public final int ordinal()
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。