Java 当类由可变属性组成时,如何确保其不变性

Java 当类由可变属性组成时,如何确保其不变性,java,immutability,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.dat

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

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());
   }
}
我们是否可以说,如果使用上述getter和setter方法设置并返回date属性,它将有助于创建不可变的类,并有助于保存用户类的内部状态以用于dateOfBirth字段

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

1.将该类声明为final,以便无法扩展

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

3.不要为变量提供setter方法

4.将所有可变字段设为最终字段,以便其值只能指定一次

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

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

在您的情况下,类将看起来像这样

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());
  }
}

你的意思是键入“使类不可变”,对吗?@jingx:是的,我已经编辑了question@Michael:tx对于答案,您能否解释一下这种类型的模式被称为什么(您的观点是,提供setter会取消它的不变性)。如果在类TX中使用可变对象作为引用时,返回防御性副本是一种很好的编程实践,那么我得到了在类中提供setter会使其无法实现不变性的观点。您能帮助我理解以上述方式设置和返回日期属性值的相关实践吗