java枚举器中的私有构造函数

时间:2012-10-11 11:13:51

标签: java oop enums

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

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;
};

5 个答案:

答案 0 :(得分:2)

在这个例子中除了显而易见的'int value'之外没有区别。

一般来说,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();
   ....
}

希望这有帮助

答案 1 :(得分:1)

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

关于为您的要求选择合适的代码。

答案 2 :(得分:1)

差别不大。第一个是更清晰的阅读+它具有内置功能来设置值。这就是您喜欢编写代码的方式。 这就像比较像

这样的东西
if (outOfBounds){
doSomething();}

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

答案 3 :(得分:1)

如果您使用Suite私有构造函数,则可以执行Suite.CLUBS.value,如果您使用标准enum,则必须使用Suite.CLUBS.ordinal()

如果您向enum添加其他属性,则使用Suite的私有构造函数会变得更有趣。

答案 4 :(得分:0)

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

这样,首先更清楚哪个int值属于哪个枚举值,如果你改变了顺序,它也不会中断。