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

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声明中的位置,其中初始常量的序数为零).大多数程序员都没有使用这种方法.它设计用于复杂的基于枚举的数据结构,例如EnumSetEnumMap.

有效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改为了.

  • @polygenelubricants:+1,但就像*"大多数程序员都没有使用Integer的numberOfLeadingZeros()"*.我肯定对*ordinal()*有很多非常有效的用法,我很高兴不被*"大多数程序员"*:) (2认同)

Chr*_*heD 7

你在寻找序数吗?