为什么System类声明为final并使用私有构造函数?

时间:2015-05-15 11:23:49

标签: java final private-constructor

根据我的理解

最后一课

  

最后一堂课只是一个无法扩展的课程。

具有单个无参数私有构造函数的类

  

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

所以我的理解是,如果我们用单个无参数私有构造函数创建一个类,那么将它们声明为最终的并不意味着它们。那么为什么Java中的System类被声明为final类,尽管它有单个无参数的私有构造函数?

我听说做出决赛有一些性能提升。这是正确的,这是将System类声明为final的唯一原因吗?请澄清为什么Java实现了这样的System类。

1 个答案:

答案 0 :(得分:4)

有时,你需要一些"实用程序"类,包含一些静态实用程序方法。预计这些课程不会延长。因此,开发人员可能会做出一些防御性决定并标记这样的类别" final"。我想说,用#" final"标记一个Java类。可能会导致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); }  
}

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

正如我所说,所有这些都是设计决定。我很确定最终课程没有带来显着的性能提升。