提问人:reda Sabbane 提问时间:9/29/2023 最后编辑:Mark Rotteveelreda Sabbane 更新时间:9/30/2023 访问量:107
如何防止类实例被更改
How to protect class instance against alteration
问:
如何修改代码的主体(可以包括构造函数的主体)以保护 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;
}
}
我知道不可变类的约束都存在于这个类中:
- 所有字段都是私有的,
- 我们没有字段的 setter,
- 我们没有带有 setters 的对象的字段
但是,我不知道我必须添加什么来保护 Person,一旦创建了 Person,就应该无法修改它。
答:
2赞
WJS
9/29/2023
#1
一种方法是使用 定义不可变类的 。您仍然可以重写以修改对象自身的显示方式。record
toString()
对于使用 getter 的类定义,请将字段设为私有字段和 final。对于那些在设计上不是不可变的字段,请执行所谓的 .对于数组和集合等对象尤其如此。可能还需要对这些数组或集合的单个单元进行深度复制。defensive copying
public Date getDate() {
return new Date(birthDate.getTime());
}
注意:已过时。从 java.time 包中使用。由于是不可变的,因此您可以安全地返回实例。Date
LocalDate
LocalDate
0赞
Reilas
9/30/2023
#2
"...我不知道我必须添加什么来保护 Person,一旦创建了 Person,就应该无法修改它。..."
你所拥有的是正确的。
(可选)不要使用构造函数方法,而应使用静态方法。
class Person {
private String name;
private Date birthDate;
/**
* Creates a Person with the given name and birth date.
*/
private Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
static Person get(String name, Date birthDate) {
return new Person(name, birthDate);
}
public String name() {
return name;
}
public Date birthDate() {
return birthDate;
}
}
评论
0赞
WJS
9/30/2023
正如我所理解的那样,他们希望使 Person 类不可变。使用您当前的 getter 对于某人仍然可以修改实例。在此示例中,返回的 from 可以更改,因为 的实例不是不可变的。Date
Person
Date
birthDate()
Date
0赞
reda Sabbane
9/30/2023
非常感谢你,请尝试您的解决方案并搜索有关不可变类的更多信息
评论
final
Date
Date
LocalDate
Date
record Person(String name, LocalDate birthDate) {}
final