如何修改代码主体(这可以包括构造函数的主体)以保护 Person 实例不被更改:一旦创建了 Person,就不可能对其进行修改。
import java.util.Date;
class Person {
private String name;
private Date birthDate;
/**
* Creates a Person with the given name and birth date.
*/
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
public String getName() {
return name;
}
public Date getBirthDate() {
return birthDate;
}
}
我知道不可变类的约束都存在于这个类中:
但是,我不知道必须添加什么来保护Person,一旦创建了Person,就不应该对其进行修改。
一种方法是使用定义不可变类的
record
。您仍然可以覆盖 toString()
来修改对象的显示方式。
对于使用 getter 的类定义,请将字段设为私有和最终。对于那些设计上并非不可变的字段,请执行所谓的
defensive copying
操作。对于数组和集合等对象尤其如此。可能还需要对这些数组或集合的各个单元进行深度复制。
public Date getDate() {
return new Date(birthDate.getTime());
}
注意:
Date
已过时。使用 java.time包中的
LocalDate
。由于 LocalDate
是不可变的,您可以安全地返回实例。