为什么将 Optional<T> 声明为最终类?

2022-09-03 13:32:11

我正在玩以下问题:使用Java 8的Optable with Stream::flatMap,并希望将方法添加到自定义中,然后检查它是否有效。
更准确地说,我想添加一个到 my 中,如果没有值,则返回空流,或者如果存在,则返回具有单个元素的流。Optional<T>stream()CustomOptional<T>

但是,我得出的结论是被宣布为最终结论。Optional<T>

为什么会这样?有很多类没有被声明为 final,我个人认为这里没有理由声明 final。Optional<T>

作为第二个问题,为什么不能所有的方法都是最终的,如果担心它们会被覆盖,并使类非最终?


答案 1

根据Java SE 8 API文档的这个页面,是一个基于值的类。根据API文档的此页面,基于值的类必须是不可变的。Optional<T>

将所有 方法声明为 final 将防止重写这些方法,但这并不妨碍扩展类添加字段和方法。扩展类并将字段与更改该字段值的方法一起添加将使该子类可变,从而允许创建可变 。下面是一个此类子类的示例,如果该子类未被声明为 final,则可以创建该子类。Optional<T>Optional<T>Optional<T>

//Example created by @assylias
public class Sub<T> extends Optional<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }
}

声明 final 可防止创建上述子类,因此保证始终不可变。Optional<T>Optional<T>


答案 2

正如其他人所说,Optional是一个基于值的类,因为它是一个基于值的类,它应该是不可变的,需要它是最终的。

但是我们错过了这一点。基于值的类是不可变的,其中一个主要原因是保证线程安全。使其不可变使其线程安全。例如字符串或原始包装器,如整数或浮点数。出于类似的原因,它们被宣布为最终版本。


推荐