是否Immutable对象:
a. 如果对象应该是常量,则应该设计成Immutable;
b. 如果对象的状态会频繁的改变,则应设计成mutable的,比如StringBuffer。
c. 如果一个对象很大,那么设计成Immutable的时候要格外谨慎。为了改变对象状态,大的Immutable对象需要拷贝这可能会耗费较多的资源。
d. 为了保证封装性,当方法返回一个Collection时应该保证其Immutable特性。
1. 属性都定义成private、final的,防止对象类的方法改变属性值、或者通过反射setAccessible改变可见性。
public class ImmutablePerson{
private final int age;
private final String firstName, lastName;
public ImmutablePerson(int age, String firstName, String lastName){
if(firstName==null || lastName==null) throws new IllegalArgumentException("firstName or lastName can not null!");
this.age = age;
}
public int getAge(){return age;}
public String getFirstName(){return firstName;}
public String getLastName(){return lastName;}
}
即使这里没有提供修改属性的接口,通过反射我们还是可以直接修改private的field。这个类还不是Immutable的。
2. 当Immutable对象中包含mutable属性时,要注意在set或者get的时候返回mutable属性的一个拷贝,而不能是其本身。
class ImmutableObject{
private final Point point;
public void initPoint(Point point){this.point=new Point(point);}
public Point getPoint(){return new Point(this.point);}
}
3. 有些时候Immutable对象要考虑性能问题。