6

据我了解

最后一堂课

final 类只是一个不能扩展的类。

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

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

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

我听说让班级决赛有一些成绩。这是正确的吗?这是将 System 类声明为 final 的唯一原因吗?请澄清我为什么 Java 实现了这样的 System 类。

4

1 回答 1

4

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

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

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

于 2015-05-15T11:48:20.667 回答