是否有必要将 Enum 成员声明为 final 以实现不变性?

Is it necessary declaring Enum member as final to achieve immutability?

我在我的代码中使用 Builder Pattern class,根据本书,它生成的对象为 immutable。 我有点怀疑枚举 Size 成员:

    public class Pizza {

    private final Size size;
    private final boolean isExtraCheese;
    private final boolean isPeperonni;
    private final boolean isBacon;

    public enum Size {
        SMALL, MEDIUM, BIG
    }
}

如果枚举被认为是常量,为什么我可以添加 final 关键字?这里有必要吗?

enum的成员是常量,但是引用枚举值的引用变量就像任何其他引用变量一样,因此需要将它们标记为final

您可以这样做:

private Size size = Size.BIG;
size = Size.SMALL;

但将 size 标记为 final 将阻止第二次赋值。

private final Size size = Size.BIG;
size = Size.SMALL; // this will not be allowed

请记住,您将 Size 类型的引用变量标记为最终变量,而不是 enum Size 本身。

假设您有 getter 和 setter 而 size 不会是 final,您可以这样做:

final Pizza pizza = new Pizza.Builder(Size.BIG, false, false, false).build();
pizza.setSize(Size.SMALL);

这将使 Pizza 的对象根据定义 not 不可变。