为继承设计类



我正在阅读J.Bloch的《高效Java》,现在我正在为继承设计类。他描述了所谓的自用模式,据我所知,我们不能在其他可重写方法中使用可重写方法。

因此,我的问题是如何让客户意识到自我使用。我们应该在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的新列表实现——您需要知道是需要覆盖addAlladd,还是只需要覆盖add

自用是可以的。Joshua Bloch说,如果你使用它,你必须确保任何扩展类的人都知道它

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

  • 你可以简单地避免自用
  • 您可以使其中一个方法涉及final,因此它不能被重写
  • 您可以将类设为final,因此不能对其进行扩展
  • 您可以在Javadoc注释中描述类的自用模式(满足让其他人知道的要求)

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

也许,您可以为方法或类使用final。

您的类应该是final类。

例如,您可以跟进String类,在该类中您不能覆盖任何方法。

他描述了所谓的自我使用模式,据我所知我们决不能在其他可重写方法中使用可重写方法方法

/***这个类是自用的,因此不能继承。*/

防止程序员不使用overriding overridable(非最终)方法的唯一方法是将类标记为final并防止其被继承。

public final class MyClass{
    public void overrideMe(){ 
        //something
        ovMe(); 
    }
    public void ovMe(){
         //some staff
    }
}

如果将方法标记为final,它将不再是overridable,因此它不符合您在quesiton中提供的描述。

最新更新