cre*_*zel 163 java inheritance final
有什么理由禁止Java中的继承,例如使用单个私有无参数构造函数使用final类或类?使方法最终成功的理由是什么?
DJC*_*rth 172
这里你最好的参考是Joshua Bloch的优秀书籍"Effective Java"的第19项,名为"继承的设计和文件,或者禁止它".(这是第二版的第17项和第一版的第15项.)你应该读它,但我会总结一下.
如果祖先不是为了继承而设计的,那么继承类与父母的交互可能会令人惊讶且难以预料.
因此,课程应分为两类:
设计用于扩展的类,并提供足够的文档来描述应如何完成
课程标记为最终
如果您正在编写纯粹的内部代码,这可能有点矫枉过正.但是,在类文件中添加五个字符所需的额外工作量非常小.如果你只是为了内部消费而写作,那么未来的编码器总是可以删除'final' - 你可以把它想象成一个警告,说"这个类的设计并没有考虑到继承".
use*_*551 13
有3个用例可供您使用最终方法.
最终成绩的目的:
因此,没有任何机构可以扩展这些类并改变它们的行为.
例如:Wrapper类Integer是一个最终类.如果该类不是final,那么任何人都可以将Integer扩展到他自己的类中并更改整数类的基本行为.为了避免这种情况,java将所有包装类作为最终类.
Ray*_*yek 12
你可能想制作不可变对象(http://en.wikipedia.org/wiki/Immutable_object),你可能想创建一个单例(http://en.wikipedia.org/wiki/Singleton_pattern),或者你可能想要防止有人因效率,安全或安全原因而超越方法.
嗯...我能想到两件事:
您可能有一门处理某些安全问题的课程。通过对其进行子类化并向您的系统提供其子类化版本,攻击者可以规避安全限制。例如,您的应用程序可能支持插件,并且如果插件可以对您的安全相关类进行子类化,则它可以使用此技巧以某种方式将其子类化版本偷运到位。然而,这实际上是 Sun 必须处理的有关 applet 等的问题,也许不是一个现实的情况。
更现实的方法是避免对象变得可变。例如,由于字符串是不可变的,因此您的代码可以安全地保留对它的引用
String blah = someOtherString;
Run Code Online (Sandbox Code Playgroud)
而不是先复制字符串。但是,如果您可以子类化 String,则可以向其添加允许修改字符串值的方法,现在没有代码可以再依赖于如果只是像上面那样复制字符串,则字符串将保持不变,而必须复制细绳。