推荐答案
// www.javascriptcn.com code example
public final class ImmutableClass {
private final int value;
private final String name;
public ImmutableClass(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
}本题详细解读
1. 使用 final 修饰类
通过将类声明为 final,可以防止其他类继承该类,从而避免子类修改其状态。
2. 所有字段声明为 final
将类的所有字段声明为 final,确保这些字段在对象创建后不能被修改。
3. 不提供 setter 方法
不可变类不应该提供任何可以修改字段值的方法,因此不提供 setter 方法。
4. 通过构造函数初始化所有字段
所有字段都应在构造函数中初始化,确保对象一旦创建,其状态就不能被改变。
5. 如果字段是可变对象,确保深拷贝
如果字段是可变对象(如集合、数组等),在构造函数中应进行深拷贝,并在返回时返回拷贝的副本,以防止外部修改。
// www.javascriptcn.com code example
public final class ImmutableClass {
private final int value;
private final List<String> list;
public ImmutableClass(int value, List<String> list) {
this.value = value;
this.list = new ArrayList<>(list); // 深拷贝
}
public int getValue() {
return value;
}
public List<String> getList() {
return new ArrayList<>(list); // 返回拷贝的副本
}
}6. 避免暴露内部可变状态
确保不直接返回内部可变对象的引用,而是返回它们的拷贝,以防止外部代码修改内部状态。
7. 线程安全
由于不可变类的状态在创建后不能被修改,因此它是线程安全的,可以在多线程环境中安全使用。