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

为什么系统类声明为final并使用私有构造函数?[副本]

葛智敏
2023-03-14

根据我的理解

最后一个类只是一个不能扩展的类。

具有私有构造函数的类不能被实例化,除非该类中的表单。这使得从另一个类扩展它毫无用处。但这并不意味着它根本不能被子类化,在内部类中,我们可以扩展并调用私有构造函数。

所以我的理解是,如果我们创建了一个具有单个无参数私有构造函数的类,那么将该类声明为final并没有任何意义。那个么,为什么Java中的系统类声明为最终类,尽管它只有一个无参数的私有构造函数?

我听说参加班级期末考试会提高成绩。这是正确的吗?这是宣布System类为最终类的唯一原因吗?请澄清我为什么Java这样实现System类。

共有1个答案

姚洲
2023-03-14

有时,您需要一些“实用程序”类,其中包含一些静态实用程序方法。这些课程预计不会延长。因此,开发人员可能会做出一些防御性的决定,并将此类类标记为“final”。我想说的是,将Java类标记为“final”可能会在Hotspot中带来一些性能改进(请参阅https://wikis.oracle.com/display/HotSpotInternals/VirtualCalls).但是,我很确定,这是一个设计决定,而不是性能决定。

如果您还想拥有一些不可变的值对象,或者希望仅通过类的工厂方法实例化类,那么可以使用final类。不可变值对象在处理并发时特别有用:

public final class MyValueObject {
   private final int value;
   private MyValueObject(int value) { this.value = value; }
   public static MyValueObject of(int value) { return new MyValueObject(value); }  
}

使用静态工厂方法,可以在工厂方法后面隐藏所有这些构造细节。此外,您可以通过该工厂控制该类在运行时的实例数,就像在单例中一样。

正如我所说的,所有这些都是设计决策。我很确定期末考试并没有带来显著的成绩提升。

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

  • 约书亚·布洛赫在高效的Java中写道: 请注意,非零长度数组总是可变的,因此类具有公共静态最终数组字段或返回此类字段的访问器是错误的。如果类具有这样的字段或访问器,客户端将能够修改数组的内容。这是安全漏洞的常见来源: 请注意,许多IDE生成的访问器会返回对私有数组字段的引用,这恰恰导致了这个问题。有两种方法可以解决这个问题。您可以将公共数组设为私有,并添加公共不可变列表: 或者,可以将数组设为私有

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

  • 我正在讨论以下问题:使用Java 8的可选和stream::FlatMap并希望向自定义的添加一个方法,然后检查它是否工作。 更准确地说,我希望向我的添加一个。如果不存在值,则返回一个空流,如果存在,则返回一个包含单个元素的流。 但是,我得出的结论是,声明为final。 为什么会这样呢?有一些类没有声明为final,我个人认为这里没有理由声明final。 作为第二个问题,为什么不是所有的方法都是f

  • 或修饰符不允许与构造函数一起使用。为什么?我试过阅读标准文档,但没有很好地理解它。

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释