根据我的理解
最后一堂课只是一个无法扩展的课程。
除了同一个类中的表单外,无法实例化具有私有构造函数的类。这使得从另一个类扩展它无用。但这并不意味着它根本不能被分类,在内部类中我们可以扩展并调用私有构造函数。
所以我的理解是,如果我们用单个无参数私有构造函数创建一个类,那么将它们声明为最终的并不意味着它们。那么为什么Java中的System类被声明为final类,尽管它有单个无参数的私有构造函数?
我听说做出决赛有一些性能提升。这是正确的,这是将System类声明为final的唯一原因吗?请澄清为什么Java实现了这样的System类。
答案 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); }
}
使用静态工厂方法,您可以隐藏工厂方法后面的所有构造细节。此外,您可以通过该工厂控制该类在运行时的实例数 - 就像在单例中一样。
正如我所说,所有这些都是设计决定。我很确定最终课程没有带来显着的性能提升。