2012-10-11 46 views
0

Java中枚举的这两个下面定义之间有什么区别,第一个与第二个的优点是什么?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

是什么让你觉得有优势?这完全取决于你想要解决什么问题。 – bmargulies

+3

为什么downvotes?我觉得这个问题很有意义 –

回答

1

如果你需要有一个领域,你使用的第一个,如果你并不需要一个字段,您将使用第二。

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

2

在这个例子中,除了明显的'int值'之外没有任何区别。

一般来说,Java 5+中的enum是一个有一些限制的类。 您无法像使用常规类一样通过'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

没有太大的区别。第一个是更清晰的阅读+它具有内置函数来设置值。这只是您更喜欢编写代码的方式。 这将是比较喜欢像

if (outOfBounds){ 
doSomething();} 

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

0

如果你打算使用一个int来表示枚举值,它可能是最好使用第一种变体,而不是依赖在枚举值的索引号上。

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

1

如果使用Suite与私有构造你可以做Suite.CLUBS.value,如果您使用标准enum你必须使用Suite.CLUBS.ordinal()

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

相关问题