设计inheritance类
我正在阅读J. Bloch的Effective Java,现在我正处于inheritance部分的设计课程中。 他描述了所谓的自用模式,据我所知,我们不能在其他可覆盖的方法中使用可覆盖的方法。
所以我的问题是如何让客户了解自我使用。 我们应该在Javadocs
明确地提到它:
/** * This class is self-use, thus it cannot be inherited. */
或者我们甚至应该拒绝self-use
的诱惑。
示例代码:我们是否应该如上所述记录该类,或者我们必须避免这种自我使用?
public class MyClass{ public void overrideMe(){ //something ovMe(); } public void ovMe(){ //some staff } }
正如您所说,自我使用是指一个可覆盖的方法调用另一个可覆盖的方法。 例如,当AbstractList.addAll
调用AbstractList.add
。
确保任何扩展课程的人都知道这一点很重要。 想象一下,您正在编写基于AbstractList
的新列表实现 – 您需要知道是否需要覆盖addAll
和add
,或者是否只需要覆盖add
。
自用就好了。 Joshua Bloch所说的是, 如果你使用它,你必须确保任何扩展课程的人都知道它 。
有几种方法可以满足此建议:
- 你可以简单地避免自我使用。
- 您可以使其中一个方法涉及
final
,因此无法覆盖它。 - 您可以使该类成为
final
,因此无法扩展。 - 您可以在其Javadoc注释中描述该类的自用模式(满足让其他人知道的要求)。
另外,为了避免可能的混淆,请注意Java语言本身并不关心自用模式。 编译器,JVM或任何其他软件也不是。 此建议纯粹是为了帮助可能正在使用您的代码的程序员(包括您,6个月后)。
也许,您可以将final用于方法或类。
你的class级应该是final
堂课。
例如,您可以跟踪String
类,您无法覆盖任何方法。
他描述了所谓的自用模式,据我所知,我们不能在其他可覆盖的方法中使用可覆盖的方法
/ ** *这个类是自用的,因此不能inheritance。 * /
阻止程序员不overriding
overridable
overriding
(非最终)方法的唯一方法是将类标记为final
并防止它被inheritance。
public final class MyClass{ public void overrideMe(){ //something ovMe(); } public void ovMe(){ //some staff } }
如果您将方法标记为final
,则它不再是overridable
因此它不符合您在问题中提供的描述。