枚举不能有公共构造函数;但是,私有构造函数是可以接受的(枚举的构造函数默认是包私有的):
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