由可变属性组成的类如何确保其不变性

时间:2018-06-29 13:55:40

标签: java immutability

要使一个类由可变属性组成时不可变,我们应该返回可变属性的防御性副本。 考虑下面提到的课程

class User {

private String firstName;
private String lastName;
private Date dateOfBirth;

// standard getter and setter for firstName and lastName 

public void setdateOfBirth(Date dateOfBirth){}
 this.dateOfBirth = new Date(dateOfBirth.getTime());

public Date getDateOfBirth(){
   return new Date(dateOfBirth.getTime());
   }
}

我们可以说如果使用上述getters和setter方法设置并返回了date属性,这将有助于将类创建为不可变的,并有助于将用户类的内部状态保存为dateOfBirth字段?

1 个答案:

答案 0 :(得分:4)

  

要在Java中创建不可变类,您必须执行以下步骤。

     

1。将该类声明为final,以使其无法扩展。

     

2。将所有字段设为私有,以便不允许直接访问。

     

3。不提供变量的setter方法

     

4。将所有可变字段都保留为最终值,使其值只能分配一次。

     

5。通过执行深度复制的构造函数初始化所有字段。

     

6。执行getter方法中的对象克隆以返回副本,而不是返回实际的对象引用

https://www.journaldev.com/129/how-to-create-immutable-class-in-java

在您的情况下,类将如下所示

public final class User {

  private final String firstName;
  private final String lastName;
  private final Date dateOfBirth;

  public User(String first, String last, Date birth) {
    this.firstName = first;
    this.lastName = last; //Since String objects are immutable no need to copy
    this.dateOfBirth = new Date(birth.getTime()); //Date is mutable so copy parameter to avoid mutation
  }

  public Date getDateOfBirth(){
   return new Date(dateOfBirth.getTime());
  }
}