设计继承类

St.*_*rio 0 java inheritance

我正在阅读J. Bloch的Effective Java,现在我正处于继承部分的设计课程中.他描述了所谓的自用模式,据我所知,我们不能在其他可覆盖的方法中使用可覆盖的方法.

所以我的问题是关于如何让客户了解自我使用.我们是否应该明确地提到它Javadocs:

/**
* This class is self-use, thus it cannot be inherited.
*/
Run Code Online (Sandbox Code Playgroud)

或者我们甚至应该拒绝这种诱惑self-use.

示例代码:我们是否应该如上所述记录该类,或者我们必须避免这种自我使用?

public class MyClass{

    public void overrideMe(){ 
        //something
        ovMe(); 
    }

    public void ovMe(){
         //some staff
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*751 5

如您所述,自我使用是指一个可覆盖的方法调用另一个可覆盖的方法.例如,在AbstractList.addAll通话时AbstractList.add.

确保任何扩展课程的人都知道这一点很重要.想象一下,你是基于写一个新的列表实现AbstractList-你需要知道你是否需要同时重写addAlladd,还是你只需要重写add.

自用是好的.Joshua Bloch所说的是,如果你使用它,你必须确保任何扩展课程的人都知道它.

有几种方法可以满足此建议:

  • 你可以简单地避免自我使用.
  • 您可以使用其中一个方法final,因此无法覆盖它.
  • 您可以创建该类final,因此无法扩展.
  • 您可以在其Javadoc注释中描述该类的自用模式(满足让其他人知道的要求).

另外,为了避免可能的混淆,请注意Java语言本身并不关心自用模式.编译器,JVM或任何其他软件也不是.此建议纯粹是为了帮助可能正在使用您的代码的程序员(包括您,6个月后).