【问题标题】:Why System class declared as final and with private constructor? [duplicate]为什么 System 类声明为 final 并带有私有构造函数? [复制]
【发布时间】:2015-05-15 11:23:49
【问题描述】:

据我了解

最后一节课

final 类只是一个无法扩展的类。

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

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

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

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

【问题讨论】:

  • 它是最终的,所以它不能被扩展,它有一个私有的构造函数,所以它不能被实例化(因为应该只有一个System)——它们并不真正相关。
  • 私有构造函数用于创建单例类,如果你扩展它,那么你可以创建超类的对象,以便限制该系统对象
  • 我想,这只是为了让每个人都清楚:甚至不要尝试扩展它。我认为在这种特殊情况下不太可能有任何性能提升,因为System 没有虚拟方法,只有静态方法。
  • 您先搜索了吗? Thisthis 在 SO 上; thisthis 在外面。

标签: java final private-constructor


【解决方案1】:

有时,您需要一些“实用程序”类,其中包含一些静态实用程序方法。这些课程预计不会延长。因此,开发人员可能会做出一些防御性决定并将此类类标记为“最终”。我想说,用“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-12-27
    • 1970-01-01
    • 2016-12-28
    • 2013-05-21
    • 1970-01-01
    • 2019-11-05
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多