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

Bac*_*ria 6 java final private-constructor

据我所知

最后一堂课

最后一个类只是一个无法扩展的类.

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

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

所以我的理解是,如果我们用单个无参数私有构造函数创建一个类,那么将它们声明为final是没有意义的.那么为什么Java中的System类声明为final类,尽管它有单个无参数的私有构造函数?

我听说上课最后有一些表现.这是正确的,这是将System类声明为final的唯一原因吗?请澄清为什么Java像这样实现了System类.

Erh*_*mir 5

有时,您需要一些“实用程序”类,其中包含一些静态实用程序方法。这些课程预计不会延长。因此,开发人员可能会做出一些防御性决定并将此类类标记为“最终”。我想说,用“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); }  
}
Run Code Online (Sandbox Code Playgroud)

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

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