Java 私有构造函数和最终

Java 私有构造函数和最终,java,Java,为什么将只有私有构造函数的类标记为final是一种好的做法?我的猜测是,这是为了让其他程序员知道它不能被子类。使一个类成为最终类会有一些(小的)性能增益,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好实践”,但我看到了它的优点。你的意思是“具有私有构造函数的类”,是吗 最后一个类不能被子类化。这可能代表设计决策。并不是所有的类都设计成子类,所以如果您的类不是子类,最好显式地标记它,以避免以后出现细微的错误 只有私有构造函数的类不能被外部世界实例化(既不是子类也不是子类)。例如,对于

为什么将只有私有构造函数的类标记为final是一种好的做法?我的猜测是,这是为了让其他程序员知道它不能被子类。

使一个类成为最终类会有一些(小的)性能增益,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好实践”,但我看到了它的优点。

你的意思是“具有私有构造函数的类”,是吗

最后一个类不能被子类化。这可能代表设计决策。并不是所有的类都设计成子类,所以如果您的类不是子类,最好显式地标记它,以避免以后出现细微的错误


只有私有构造函数的类不能被外部世界实例化(既不是子类也不是子类)。例如,对于要控制创建类的哪些实例的单例或类,这可能很有用。例如,在Java5之前,模式使用这种方式。

通常认为(例如,Josh Bloch和C#的设计者)最好将所有内容标记为最终内容,除非您有明确的理由不这样做。假设您指的是类,那么只有私有构造函数的类不能被子类化是正确的。因此,最终版本可能被认为是多余的,但正如您所说,它对文档有价值。正如Marc所建议的,它也可能有助于优化。

我们通过将构造函数设置为私有来将类标记为最终类,以避免子类

在我们不希望人们重写我们的类方法并更改功能或将功能添加到类中的情况下,这是一个很好的实践


例如,类String和Math是最终类,我们不能扩展或子类化它们,这是为了确保没有人会改变它们的行为。

带有私有构造函数的最终类:

  • 类不能有子类,我们不能扩展最终类
  • 类具有私有构造函数,我们无法创建该类的对象

这意味着类的其他方法将是静态的,以便类可以访问它们。

method->constructor?你是说一个类吗?把一个类标记为final,你是说?严格地说,一个带有私有构造函数的类可以被子类化,只要构造函数可以从子类的构造函数访问,例如,当子类是嵌套类时,JIT编译器不会看到该类是否加载了任何具体的子类以及是否重写了一个方法吗?我可以想象,在这种情况下,不管类/方法是否声明为
final
,它都可以内联。再说一次,我不是JIT专家,只是好奇:-)HotSpot决定类是否加载了子类。如果类被标记为
final
与否没有区别。这有着有趣的含义。例如,如果动态加载以前没有加载子类的类的子类,则热点编译器需要重新编译该类@史蒂芬C:我就是这么想的。也许这种行为在以后的JVM版本中已经改变了。@Stephen C:实际上,需要备份的是编译后的调用代码。“经常被谁考虑”呢?[需要引用]将所有内容标记为最终结果?我想你指的是变量和参数。但将所有类和方法标记为final并不是一个好主意。这将限制应用程序的可扩展性。@hard-coded,他写道“将所有内容都标记为final,除非您有明确的理由不这样做”。也就是说,您只允许扩展设计为可扩展的类。@Donal、Josh Bloch(“继承的设计和文档,或者禁止它”)和C#的设计者都认为非扩展性应该是默认的。你看,我的观点是,最好支持你的答案中有争议的部分,并提及你所关注的权威(或问题)。(就我个人而言,我在哲学上不同意他们的观点——我倾向于开放世界模式,尽管我强烈使用授权——但这不是我想在这里提出的论点。)是的,我刚刚看到了这一点。很抱歉我取消了否决票。我认为第二点不成立。我们仍然可以通过静态工厂方法创建其构造函数都是私有的类的对象。