像C#中的Enum in Java

时间:2017-12-21 05:24:15

标签: java c#

我想有一些想法

public enum CategoryTypes 
{
        Unknown = 0,
        One = 1,
        Two = 2,
}
在Java中

?因此可以将Int转换为值,反之亦然。 有可能吗?

2 个答案:

答案 0 :(得分:2)

Java中的枚举实际上是由您创建的枚举表示的类的Singleton实例。对于具有值的实例,您需要将其存储在类中,并创建一个私有构造函数来设置它们。另外一个getter方法会很好。例如:

  public enum MyEnum {
      INSTANCE(5),
      N2(2);

     private int member;
     private MyEnum(int member) {
       this.member = member;
     }
  }

答案 1 :(得分:1)

TL;博士

int i = Fruit.GRAPE.ordinal() ;  // Beware: Horrible misnomer; actually a zero-based index rather than an ordinal.

...和...

Fruit f = Fruit.values()[i] ;

但不要这样做!请继续阅读以获取详细信息。

Java Enum

Java提供了一个非常有用,灵活且功能强大的枚举版本。

请参阅:

可以这么简单:

public enum Fruit {
    APPLE , 
    ORANGE , 
    GRAPE
}

使用它:

Fruit f = Fruit.APPLE ;

通常我们不需要表示为枚举定义元素的顺序的基础整数。相反,我们只使用枚举的每个元素作为普通的Java对象,而不是仅仅使用int数字。但如果你坚持:

  • 调用Enum::ordinal来检索从零开始的索引号(这种方法是一个可怕的误称,因为它是一个索引而不是一个基于序数的索引)
    int i = Fruit.GRAPE.ordinal() ;
  • 致电Enum::values以生成一个数组,您可以通过从零开始的索引访问该数组Fruit f = Fruit.values()[i] ;

这样做几乎可以肯定你将无法充分利用Java enum 工具的全部功能。使用实际的枚举对象而不仅仅是int可以为您提供类型安全性,确保有效值,并使您的代码更加自我记录。

如果您的目的是为每个枚举实例分配一个有意义的代码,请通过定义一个由构造函数填充的成员变量来明确地执行此操作,如上所述herehere

您可以添加方法,甚至可以添加带参数的构造函数。更重要的是:EnumSetEnumMap是针对极少内存和非常快速执行而优化的专用集合。

Set< Fruit > favoriteFruits = EnumSet.of( Fruit.APPLE , Fruit.ORANGE ) ;

奇怪的是,EnumSet没有实现SortedSet,但它被记录为按枚举定义的顺序返回实例。

搜索Stack Overflow以获得更多讨论和示例。

有关Enum的主要示例,请参阅: