首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在什么情况下才能进入期末考试?

在什么情况下才能进入期末考试?
EN

Stack Overflow用户
提问于 2012-07-31 06:04:16
回答 3查看 4K关注 0票数 12

对于什么时候让一个类成为最终的类,有什么通用的指导原则吗?

我认为这是如果你不想让人们扩展你的课程,但这似乎有点...天真??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-31 06:12:11

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

  • 一个典型的用例是保证不变性。如果你设计了一个不可变的类,但没有让它成为最终类,那么它可以以一种可变的方式进行扩展。这反过来可能导致子类损坏类不变量或造成并发问题。
  • 您也可以简单地将一个类标记为final,以证明它不是被设计为可扩展的。参见有效的Java #17:“继承的设计和文档,否则禁止继承”。
票数 12
EN

Stack Overflow用户

发布于 2012-07-31 06:21:54

理想情况下,您已经阅读了Josh Bloch并为完美工作的继承而设计了您的类。但是,在实践中,我(IMHO)对期末考试的答案是

你信任(或希望)别人来扩展它吗?

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

如果你正在做一些非常花哨的事情,并且这个类很难正确地扩展,那么可以考虑让它成为最终的类,这取决于你期望那些使用这个类的人所具备的技能。这也取决于这是一个通用库还是一些公司/项目特定的代码,以及它是一个带有松鼠视频的网站还是一个心脏起搏器-也就是说,一个糟糕的子类会有多严重地破坏东西?

如果你不是在做任何花哨的事情,那就不要把它设为最终版本来惹恼用户。我经常咒骂Java做了像Double final这样的类。

票数 5
EN

Stack Overflow用户

发布于 2012-07-31 06:16:02

众所周知,继承破坏了封装。Allan Snyder在他的论文Encapsulation and inheritance in object-oriented programming languages中展示了继承时必须注意的事项。

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11730352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档