12

是否有关于何时进行期末考试的一般指导方针?

我以为是如果您不希望人们扩展您的课程,但这似乎有点……天真?

4

3 回答 3

12

将类设为 final 只会阻止它被扩展,正如您所注意到的。你为什么想这么做?

  • 一个典型的用例是保证不变性。如果您设计了一个不可变类但没有使其成为最终类,则可以以可变方式对其进行扩展。这反过来又会导致子类破坏类不变量或产生并发问题。

  • 您也可以简单地将一个类标记为 final 以记录它不是为扩展而设计的事实。例如,请参见 Effective Java #17:“Design and document for inheritance or else to prevent it”。

于 2012-07-30T22:12:10.600 回答
5

理想情况下,您已经阅读了 Josh Bloch 并设计了您的类以实现完美的继承。但是,在实践中,我(恕我直言)对班级决赛的回答是

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

如果它是一个超级关键类String或一些与安全相关的类,是的,一定要让它成为最终的。

如果您正在做真正花哨的东西并且课程很难正确扩展,请考虑将其定为最终版本,具体取决于您希望使用该课程的人具备的技能。还取决于这是一个通用库还是某些公司/项目特定代码,以及它是用于带有 Squirrel 视频的网站还是心脏起搏器 - 即,一个糟糕的子类会破坏多严重?

如果您没有做任何花哨的事情,请不要将其定为最终版本而惹恼用户。我经常诅咒Java制作像Doublefinal这样的类。

于 2012-07-30T22:21:53.693 回答
4

众所周知,继承破坏了封装。Allan Snyder 在他的论文《面向对象编程语言中的封装和继承》中展示了您必须谨慎对待继承。

Josua Bloch 在他的《Effective Java 》一书中建议您设计和记录要继承的类,否则就禁止它,这正是 Snyder 已经知道的问题。

如果在某些时候您不确定将来如何扩展您的课程,或者如果您不打算实际扩展它们,那么您最好将它们定为最终版本。您可以随时打开它们以进行扩展,但相反(尤其是如果您正在构建一个开放系统)可能是痛苦的真正原因,如果不是不可能的话,取决于具体情况。

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

于 2012-07-30T22:16:01.880 回答