【问题标题】:Immutable class with mutable member field具有可变成员字段的不可变类
【发布时间】:2020-05-14 15:43:39
【问题描述】:

假设我有一个不可变类,比如 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 类仍然可以通过哪些方式保持不可变?

【问题讨论】:

  • 简而言之,没有。最好的办法是创建一个扩展 Address 并隐藏 setter 功能的 ImmutableAddress
  • 没有。真正的不变性要求 current 对象是不可变的(完全是最终的),并且它的所有实例变量也是不可变的。

标签: java class immutability mutable


【解决方案1】:

一个绝对不可变的类只能是:

  1. 课程结束
  2. 所有字段都是最终字段
  3. 如果该字段是一个对象,那么在该对象内部,所有字段也必须是不可变的,并且类本身也必须是最终的。

因此,setter 不应出现在此类中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2011-11-11
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多