3 回答
TA贡献1794条经验 获得超7个赞
这里最好的参考是Joshua Bloch的优秀著作“ Effective Java”的第19项,称为“继承的设计和文档,否则将禁止继承”。(在第二版中是第17项,在第一版中是第15项。)您应该阅读它,但我将进行总结。
如果祖先不是为了继承而来的,则继承的类与父母之间的交互可能是令人惊讶且不可预测的。
因此,类应分为两种:
设计为可扩展的类,并提供足够的文档来描述应如何完成
标记为最终课程
如果您纯粹是在编写内部代码,则可能有点过大。但是,在类文件中添加五个字符所涉及的额外工作量很小。如果您仅出于内部消耗而编写,那么将来的编码人员可以随时删除“最终”,您可以将其视为警告,指出“该类在设计时并未考虑继承”。
TA贡献1856条经验 获得超5个赞
在3个用例中,您可以使用最终方法。
为了避免派生类重写特定的基类功能。
这是出于安全目的,基类提供了框架的一些重要核心功能,而派生类不应该对其进行更改。
最终方法比实例方法更快,因为最终和私有方法没有使用虚拟表概念。因此,只要有可能,请尝试使用最终方法。
最终上课的目的:
这样,任何人都无法扩展这些类并改变其行为。
例如:包装器类整数是最后一堂课。如果该类不是最终类,则任何人都可以将Integer扩展到自己的类中,并更改整数类的基本行为。为了避免这种情况,java将所有包装器类都设置为最终类。
TA贡献2016条经验 获得超9个赞
嗯...我可以想到两件事:
您可能有一个处理某些安全问题的课程。通过子类化并将其子类化的版本提供给系统,攻击者可以规避安全性限制。例如,您的应用程序可能支持插件,并且如果插件仅可以将与安全性相关的类作为子类,则它可以使用此技巧以某种方式将其子类版本走私到位。但是,这是Sun必须在小程序等方面处理的事情,也许不是这样的现实情况。
一种更现实的方法是避免对象变得可变。例如,由于字符串是不可变的,因此您的代码可以安全地保留对其的引用
String blah = someOtherString;
而不是先复制字符串。但是,如果可以将String子类化,则可以向其添加允许修改字符串值的方法,现在再也没有代码可以依赖它了,如果仅按上述方式复制字符串,则字符串将保持不变,而必须复制串。
添加回答
举报