枚举不能有公共构造函数;但是,私有构造函数是可以接受的(枚举的构造函数默认是包私有的):
public enum Coin {
PENNY(1), NICKEL(5), DIME(10), QUARTER(25); //usual names for US coins
//note that the above parentheses and the constructor arguments match
private int value;
Coin(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
int p = Coin.NICKEL.getValue(); //the int value will be 5
建议我们将所有字段设为私有并提供 getter 方法,因为枚举的实例数量是有限的。
如果我们将 Enum 实现为一个类,它将如下所示:
public class Coin> implements Comparable, Serializable{
public static final Coin PENNY = new Coin(1);
public static final Coin NICKEL = new Coin(5);
public static final Coin DIME = new Coin(10);
public static final Coin QUARTER = new Coin(25);
private int value;
private Coin(int value){
this.value = value;
}
public int getValue() {
return value;
}
}
int p = Coin.NICKEL.getValue(); //the int value will be 5
枚举常量在技术上是可变的,因此可以添加一个 setter 来更改枚举常量的内部结构。
然而,这被认为是非常糟糕的做法,应该避免。
最佳实践是使 Enum 字段不可变,最终:
public enum Coin {
PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
private final int value;
Coin(int value){
this.value = value;
}
…
}
我们可以在同一个枚举中定义多个构造函数。
当你这样做时,你在枚举声明中传递的参数决定调用哪个构造函数:
public enum Coin {
PENNY(1, true), NICKEL(5, false), DIME(10), QUARTER(25);
private final int value;
private final boolean isCopperColored;
Coin(int value){
this(value, false);
}
Coin(int value, boolean isCopperColored){
this.value = value;
this.isCopperColored = isCopperColored;
}
…
}
注意:所有非原始枚举字段都应该实现 Serializable,因为 Enum 类确实如此。
日期:2020-06-02 22:15:21 来源:oir作者:oir
