要使一个类由可变属性组成时不可变,我们应该返回可变属性的防御性副本。 考虑下面提到的课程
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字段?
答案 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());
}
}