不可变类定义

  1. 方法所有属性均不提供setter方法
  2. 所有属性均为final、private
  3. 不允许子类重构方法,最简单的方式,就是在类上加上final关键字,这样类不可继承,即所有方法均不会被重构;
  4. 如果属性为可变类的引用,则 ① 不提供改变可变类的方法 ② 不要共享对可变对象的引用。 永远不要存储对传递给构造函数的外部可变对象的引用; 如有必要,创建副本并存储对副本的引用。 同样,必要时创建内部可变对象的副本,以避免在方法中返回原始对象。

范例

1. 不可变类(包含可变引用属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public final class Employee{
private final int id;
private final Address address;
public Employee(int id, Address address)
{
this.id = id;
this.address=new Address(); // defensive copy
this.address.setStreet(address.getStreet());
}
pulbic int getId(){
return id;
}
public Address getAddress() {
Address nuAdd = new Address(); // must copy here too
nuAdd.setStreet(address.getStreet());
return nuAdd;
}

2. 可变类

1
2
3
4
5
6
7
8
9
public class Address{
private String street;
public String getStreet(){
return street;
}
public void setStreet(String street){
this.street = street;
}
}

参考资料

  1. 不可变类策略 - 官方链接