为什么要避免使用最终关键字?

2022-09-05 00:01:32

在java中,有没有允许非抽象类扩展的情况?

当存在类层次结构时,它似乎总是表明代码不正确。你同意吗,为什么/为什么不同意?


答案 1

当然,有时候拥有非最终的具体类是有意义的。但是,我同意Kent的观点 - 我相信类在默认情况下应该是最终的(在C#中密封),并且Java方法在默认情况下应该是最终的(就像它们在C#中一样)。

正如 Kent 所说,继承需要仔细的设计和文档编制 - 很容易认为您可以只重写单个方法,但不知道在什么情况下可以从基类调用该方法作为实现其余部分的一部分。

有关此内容的更多讨论,请参阅“如何设计用于继承的类”。


答案 2

我同意乔恩和肯特的观点,但就像斯科特·迈尔斯(Scott Myers)(在《有效C++》中)一样,我走得更远。我相信每个类都应该是抽象的,或者是最终的。也就是说,只有任何层次结构中的叶类才真正适合直接实例化。所有其他类(即继承中的内部节点)都是“未完成的”,因此应该是 。abstract

对于通常的类来说,进一步扩展是没有意义的。如果类的某个方面值得扩展和/或修改,那么更简洁的方法是将该类分成一个基类和一个具体的可互换实现。abstract


推荐