当前位置: 首页 > 知识库问答 >
问题:

为什么可选的被声明为final类?

龚彬
2023-03-14

我正在讨论以下问题:使用Java 8的可选和stream::FlatMap并希望向自定义的可选 添加一个方法,然后检查它是否工作。
更准确地说,我希望向我的CustomOptional 添加一个stream()。如果不存在值,则返回一个空流,如果存在,则返回一个包含单个元素的流。

但是,我得出的结论是,可选 声明为final。

为什么会这样呢?有一些类没有声明为final,我个人认为这里没有理由声明optional final。

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

共有1个答案

高功
2023-03-14

根据Java SE 8 API文档的这一页,可选 是一个基于值的类。根据API文档的这一页,基于值的类必须是不可变的。

optional 中的所有方法声明为final将防止重写这些方法,但这不会阻止扩展类添加字段和方法。扩展类并添加一个字段以及一个更改该字段值的方法,将使该子类变,从而允许创建一个可变的可选 。下面是这样一个子类的示例,如果optional 不声明为final,则可以创建该子类。

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

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

声明optional final可以防止创建像上面这样的子类,从而保证optional 始终是不可变的。

 类似资料:
  • 问题内容: 目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript 3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数: 在此函数签名中,作者已将scoreTable参数

  • 问题内容: 当我得知该类在Java中被声明为final时,我想知道为什么会这样。那时我没有找到任何答案,但是这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问。 当然,String提供了我所需要的所有功能,而且我从未想过需要扩展String类的任何操作,但是您仍然永远不会知道有人可能需要什么! 那么,有谁知道设计师决定将其定稿时的意图是什么? 问题答案: 将字符串实现为不可变对

  • 问题内容: 为什么即使该类中没有抽象方法,也将类声明为抽象? 问题答案: 这是因为它遵循模板方法设计模式。这些方法具有返回HTTP 405 未实现方法 错误的所有默认行为。如果所有这些方法都是抽象的,那么即使您的业务需求根本不需要它们,也将不得不覆盖所有这些方法。这只会导致样板代码和不确定/不直观的行为。

  • 根据我的理解,类被声明为final,以防止它被扩展/继承。因此,我认为在这方面可能会有安全性,也可能会有一些性能提升。 但这背后是否有一个非常具体的设计决策?比如说:实现某种设计模式?我确实在这里绕了一个类似的线!但答案并不是我想要的

  • 对于伪代码 出现错误的原因是我的CSV文件是分块解析的,即我不是一次传递整个文件内容,而是传递其中的一个块,错误是有意义的,因为不能保证会遇到关闭令牌 例如,字符串可以是。 但是,问题是,这些类被声明为final类,我不能扩展它们。我想明白为什么这些类被声明为final?

  • 使用Spring框架实现以下场景 请注意:方法是公共的,在不同的类中。省略了参数和不相关的东西。SaveNotAllowedException被选中异常。 在saveRow方法上,我声明我希望对检查的异常进行回滚。在createOrder方法中,我捕获该异常并执行相关工作来处理该情况。但由于这是一个预期的回滚,我希望Spring也将其视为预期的回滚,并让我尝试一下。 有些人认为这是一个特例。据我理