0

下面这两个 Java 中的 enum 定义有什么区别,第一个比第二个有什么优势?

public enum Suit {//first definition
   CLUBS (1), SPADES (2), HEARTS (3), DIAMONDS (4);
   int value;
   private Suit(int v) { value = v; }
};

public enum Suit {//second definition
   CLUBS, SPADES, HEARTS, DIAMONDS;
};
4

5 回答 5

2

在此示例中,除了明显的“int 值”之外没有其他区别。

一般来说,Java 5+ 中的枚举是一个有一些限制的类。您不能像使用普通类一样使用“new”自己创建枚举实例。

另一方面,枚举可以像常规类甚至方法一样具有数据字段。

如果您的枚举代表行星,并且每个枚举实例都包含一些非常有用的数据,例如行星半径,该怎么办?在这种情况下,您将编写如下代码:

public enum Planet {

    EARTH(6000), VENUS(5000);
    int radius;
    private Planet(int radius) {this.radius = radius;}

     // now define a getter:

     public int getRadius() {

         return radius;
     } 
}

注意这里的吸气剂。它将允许直接从枚举实例访问此类数据。

例如:

public void somewhereInYourCode(...) {

   .....
    Planet p = getPlanet(); // get the planet from your system 

    int radius = p.getRadius();
   ....
}

希望这可以帮助

于 2012-10-11T11:21:44.063 回答
1

如果您需要一个字段,则使用第一个字段,如果您不需要字段,则使用第二个字段。

它是关于为您的要求选择正确的代码。

于 2012-10-11T11:21:34.953 回答
1

差别不大。第一个更容易阅读+它具有用于设置值的内置功能。这只是您喜欢编写代码的方式。这就像比较类似的东西

if (outOfBounds){
doSomething();}

if(outOfBounds == true){ doSomething();}

于 2012-10-11T11:22:25.910 回答
1

如果你使用 Suite一个私有构造函数你可以这样做Suite.CLUBS.value,如果你使用enum你必须使用的标准Suite.CLUBS.ordinal()

如果您将enum其他属性添加到您的Suite.

于 2012-10-11T11:23:38.760 回答
0

如果您打算使用 int 来引用枚举的值,最好使用第一个变体而不是依赖枚举值的索引号。

这样首先更清楚哪个 int 值属于哪个枚举值,并且如果您更改顺序也不会中断。

于 2012-10-11T11:22:42.190 回答