带构造函数的枚举器
enum
不能有公共构造函数; 但是,私有构造函数是可接受的(枚举的构造函数默认是 package-private ):
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
实现为 class
,它将如下所示:
public class Coin<T extends Coin<T>> implements Comparable<T>, 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 来改变枚举常量的内部结构。但是,这被认为是非常糟糕的做法,应该避免。
最佳做法是使用 enhuan4 使 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
类可以实现。