有哪些好的理由可以禁用Java中的继承,例如使用final类或使用单个私有无参构造函数的类?使用final方法的好理由是什么?
有哪些好的理由可以禁用Java中的继承,例如使用final类或使用单个私有无参构造函数的类?使用final方法的好理由是什么?
你可能希望将一个方法声明为final,这样覆盖它的类就不能改变其他方法所依赖的行为。在构造函数中调用的方法通常被声明为final,以避免在创建对象时出现任何不愉快的意外。
有三种情况可以使用final方法:
使类成为最终类的目的:
以便没有人可以扩展这些类并更改它们的行为。
例如:包装类Integer是一个最终类。如果该类不是最终类,则任何人都可以将其扩展到自己的类中并更改整数类的基本行为。为了避免这种情况,Java将所有包装类都设置为最终类。
你可能想要创建不可变对象 (http://en.wikipedia.org/wiki/Immutable_object),你可能想要创建单例 (http://en.wikipedia.org/wiki/Singleton_pattern),或者你可能想要防止某人覆盖该方法,出于效率、安全性或安全性的原因。
嗯... 我能想到两件事:
你可能拥有一个处理某些安全问题的类。通过对其进行子类化并提供系统子类化版本,攻击者可以规避安全限制。例如,你的应用程序可能支持插件,如果插件可以仅仅子类化你的安全相关类,它可以使用这个技巧将一个子类化版本偷偷地放在正确的位置上。然而,这实际上是Sun公司需要解决的问题,涉及小程序等,可能不是这样一个现实情况。
一个更实际的例子是避免对象变得可变。例如,由于字符串是不可变的,因此你的代码可以安全地保留对它的引用。
String blah = someOtherString;
通过子类化String对象,可以添加方法来修改字符串的值,而不是先复制该字符串。但是,如果你能够子类化String,你可以为其添加方法,允许修改字符串的值,现在没有代码可以再依赖于只复制字符串就可以保持原样,相反,它必须复制字符串。
如果您将类和方法标记为final,您可能会注意到一些小的性能提升,因为运行时不必查找要调用给定对象的正确类方法。非final方法被标记为虚拟方法,以便在需要时可以正确扩展,final方法可以直接链接或编译成类内联。