下面这两个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;
};
答案 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值属于哪个枚举值,如果你改变了顺序,它也不会中断。