Her*_*che 8 c java enums constants
Perhap这是一个简单的基本问题
有一个枚举
public enum TK{
ID,GROUP,DATA,FAIL;
}
Run Code Online (Sandbox Code Playgroud)
我可以获得订单号,例如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;
}
};
Run Code Online (Sandbox Code Playgroud)
得到数字所以我写TK.ID.get(),TK.GROUP.get()等...我不喜欢那样
有一个更好的方法?
(C enums,C macros ..我想念你们两个)
谢谢
pol*_*nts 14
在ordinal()做你想做的事.这是文档的摘录:
返回此枚举常量的序数(在其
enum声明中的位置,其中初始常量的序数为零).大多数程序员都没有使用这种方法.它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap.
有效Java第2版的 Josh Bloch 进一步解释了为什么使用ordinal()是一个糟糕的主意.以下是一些引用,略有编辑:
永远不要从序数中得出与枚举相关的值; 将其存储在实例字段中.(第31项:使用实例字段而不是序数)使用序数来索引数组很少是合适的:
EnumMap改为使用.一般原则是应用程序员应该很少(如果有的话)使用Enum.ordinal.(第33项:使用EnumMap而不是序数索引)
你的"奇怪和漫长"的方式恰恰是第31项的处方.
幸运的是,Java不是C. Java enum非常强大和灵活,受到许多库类的支持,你应该学会拥抱它们而不是使用它们ordinal().
看看EnumMap例如.
Map用于enum类型键的专用实现.enum映射中的所有键必须来自enum创建映射时显式或隐式指定的单个类型.枚举映射在内部表示为数组.这种表现非常紧凑和高效.
也就是说,而不是以下(这可能是你想要做的):
T[] arr = ...;
TK tk = ...;
T something = ...;
arr[tk.ordinal()] = something;
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
Map<TK,T> map = new EnumMap<TK,T>(TK.class);
TK tk = ...;
T something = ...;
map.put(tk, something);
Run Code Online (Sandbox Code Playgroud)
本书还介绍了C中的另一种"传统"(ab)用法enum,即位域(为每个常量赋予2的幂等).好吧,因为Java已经EnumSet改为了.