Java如何实现带构造函数的枚举

枚举不能有公共构造函数;但是,私有构造函数是可以接受的(枚举的构造函数默认是包私有的):

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