是否有必要将 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 不可变。
我在我的代码中使用 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 不可变。