具有可变成员字段的不可变类

Immutable class with mutable member field

提问人:kingkong 提问时间:5/14/2020 更新时间:5/15/2020 访问量:385

问:

假设我有一个不可变的类,比如 Employee,其可变成员地址字段类型为 Address 类,如下所示:

public final class Employee{
    private final Integer empId;
    private final String empName;
    private final Address address;

    public Integer getEmpId(){
        return empId;
    }
    public String getEmpName(){
        return empName;
    }
    public Address getAddress(){
        return address;
    }
}

public class Address {
    private String firstLine;
    private String secondLine;
    private Integer pinCode;

    public String getFirstLine() {
        return firstLine;
    }
    public void setFirstLine(String firstLine) {
        this.firstLine = firstLine;
    }
    public String getSecondLine() {
        return secondLine;
    }
    public void setSecondLine(String secondLine) {
        this.secondLine = secondLine;
    }
    public Integer getPinCode() {
        return pinCode;
    }
    public void setPinCode(Integer pinCode) {
        this.pinCode = pinCode;
    }   
}

如上所示,Employee 类试图做到不可变,但事实真的如此吗?

我们可以更改 Employee 对象的地址,打破不变性。尽管有可变成员,但 Employee 类仍可以通过哪些方式保持不可变?

爪哇岛 不变性 可变

评论

3赞 Michael Bianconi 5/14/2020
简而言之,没有。最好的办法是创建一个扩展和隐藏二传手功能的功能。ImmutableAddressAddress
0赞 Michael Bianconi 5/17/2020
不。真正的不可变性要求当前对象是不可变的(完全是最终的),并且其所有实例变量也是不可变的。

答:

0赞 S.Daineko 5/14/2020 #1

一个绝对不可变的类只能在以下情况下:

  1. 课程是期末课程
  2. 所有字段均为最终字段
  3. 如果字段是一个对象,那么在这个对象中,所有字段也必须是不可变的,并且类本身也必须是最终的。

因此,此类中不应出现二传手。

因此,在您的情况下,实现了部分不变性。