关于创建Immutable对象时需要注意的几个问题

 是否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对象要考虑性能问题。 

原文地址:https://www.cnblogs.com/xinglongbing/p/2228649.html