对于私有引用类型,应该返回所谓的“防御性副本”,以避免返回私有字段的引用。
我想知道对于私有枚举类型是否需要这样做。我在某个地方读到枚举是不可变引用类型,因此答案应该是“不需要”。这正确吗?
对于私有引用类型,应该返回所谓的“防御性副本”,以避免返回私有字段的引用。
我想知道对于私有枚举类型是否需要这样做。我在某个地方读到枚举是不可变引用类型,因此答案应该是“不需要”。这正确吗?
枚举本质上并不是不可变的,但您无法创建防御性副本,因为只有一组固定实例可用 - 您必须返回对现有实例之一的引用,而不是创建新实例。
通常情况下,枚举应该是不可变的,但为了抵消它们本质上不可变的说法:
enum BadEnum {
INSTANCE;
private int foo;
private int getFoo() {
return foo;
}
public int setFoo(int foo) {
this.foo = foo;
}
}
class Test {
public static void main(String[] args) {
BadEnum.INSTANCE.setFoo(10);
System.out.println(BadEnum.INSTANCE.getFoo()); // Prints 10
}
}
简而言之:
String
和int
,但不包括Date
或Calendar
)。如果您必须使用可变类型,请确保永远不要直接返回引用 - 只需创建一个防御性副本即可。 - Jon Skeet