可变类作为不可变类的子类

2022-09-04 07:19:14

我希望有像这样的不可变Java对象(强简化):

class Immutable {

    protected String name;

    public Immutable(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

在某些情况下,对象不仅应该是可读的,而且应该是可变的,所以我可以通过继承来添加可变性:

public class Mutable extends Immutable {

    public Mutable(String name) {
        super(name);
    }

    public void setName(String name) {
        super.name = name;
    }

}

虽然这在技术上很好,但我想知道它是否符合OOP和继承,可变性也是不可变的类型。我想避免为不可变对象抛出OOP犯罪,就像Java集合API所做的那样。UnsupportedOperationException

你觉得怎么样?还有其他想法吗?


答案 1

避免调用父类“不可变”,因为它在子类中成为谎言 - 如果你确实想让一个类不可变,它也应该是最终的,以防止这个问题。

Joda Time使用“ReadableXXX”来给出“此类仅提供读取访问权限;其他子类可能是可变的”。我不确定我是否喜欢这个想法,但我不能说我见过很多选择。

基本上,问题在于表达否定 - 描述你不能做什么(改变它),这不能在子类中明智地强制执行。(即使其中的字段是最终的,它也不会阻止子类拥有自己的可变字段。ImmutableImmutable


答案 2

你的子类是坏的,因为它违反了Liskov替换原则。别这样。