带构造函数的枚举器

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 类可以实现。