让课程最终成败的情况?

时间:2012-07-30 22:04:16

标签: java

是否有关于何时进行课程决赛的一般指导原则?

我以为如果你不想让人们扩展你的班级,但这似乎有点......天真?

3 个答案:

答案 0 :(得分:11)

使一个类最终只能阻止它在您注意时被扩展。你为什么要那样做?

  • 一个典型的用例是保证不变性。如果你设计了一个不可变类但没有使它成为最终类,它可以以一种可变的方式扩展。这可能反过来导致子类破坏类不变或创建并发问题。

  • 您也可以简单地将一个类标记为final,以记录它不是为了扩展而设计的。例如,参见Effective Java#17:“继承的设计和文档,或者禁止它”。

答案 1 :(得分:5)

理想情况下,您已经阅读了Josh Bloch并设计了您的课程,以实现完美的继承。但是,在实践中,我(恕我直言)回答最后的课程是

您是否相信(或希望)其他人扩展它?

如果它是一个超级关键的类,如String或某些安全相关的类,是的,绝对是最终的。

如果你正在做一些真正的花哨的东西并且这个课程很难正确地扩展,考虑使它成为最终的,这取决于你期望那些使用该类的技能。还取决于这是一个通用的图书馆还是一些公司/项目特定的代码,以及它是用于带有Squirrel视频的网站还是一个心脏起搏器 - 也就是说,一个糟糕的子类会破坏多么糟糕的东西???

如果你没有做任何花哨的事情,不要让用户最终成功。我经常诅咒Java来制作像Double final这样的课程。

答案 2 :(得分:4)

已确定继承会破坏封装。艾伦·斯奈德(Allan Snyder)在他的论文Encapsulation and inheritance in object-oriented programming languages中证明了你必须用继承来锻炼。

Josua Bloch在他的书Effective Java中建议你设计和记录你的类继承,否则你禁止它,正好指的是Snyder已经知道的问题。

如果在某些时候你不确定将来如何扩展你的课程,或者如果你无意实际扩展它们,那么你可能最好还是让它们成为最终的。您可以随时打开它们以进行扩展,但相反(最重要的是,如果您正在构建一个开放系统)可能是一个真正的痛苦原因,如果不是根据情况不可能。

Mikhajlov和Sekerinski在他们的论文A Study of the Fragile Base Class中的研究表明,当不正确地使用继承时,你可能会遇到一系列问题,这可能会让你更广泛地了解为什么这可能很重要。