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

时间:2010-05-04 13:29:46

标签: java c constants enums

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 ..我想念你们两个人)

感谢

5 个答案:

答案 0 :(得分:14)

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

  

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

Effective Java 2nd Edition 中的Josh Bloch进一步解释了为什么使用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()

是在tkTK

的实例的情况下执行此操作的方法

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。