如何保护类实例不被更改

问题描述 投票:0回答:1

如何修改代码主体(这可以包括构造函数的主体)以保护 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;
    }
}

我知道不可变类的约束都存在于这个类中:

  1. 所有字段都是私有的,
  2. 我们没有字段设置器,
  3. 我们没有带有设置器的对象的字段

但是,我不知道必须添加什么来保护Person,一旦创建了Person,就不应该对其进行修改。

java immutability
1个回答
0
投票

一种方法是使用定义不可变类的

record
。您仍然可以覆盖
toString()
来修改对象的显示方式。

对于使用 getter 的类定义,请将字段设为私有和最终。对于那些设计上并非不可变的字段,请执行所谓的

defensive copying
操作。对于数组和集合等对象尤其如此。可能还需要对这些数组或集合的各个单元进行深度复制。

public Date getDate() {
    return new Date(birthDate.getTime());
}

注意:

Date
已过时。使用
java.time
包中的 LocalDate。由于
LocalDate
是不可变的,您可以安全地返回实例。

© www.soinside.com 2019 - 2024. All rights reserved.