设计继承类

时间:2015-06-29 07:44:05

标签: java inheritance

我正在阅读J. Bloch的Effective 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
    }
}

4 个答案:

答案 0 :(得分:5)

正如您所说,自我使用是指一个可覆盖的方法调用另一个可覆盖的方法。例如,当AbstractList.addAll调用AbstractList.add

确保任何扩展班级的人都知道这一点非常重要。想象一下,您正在编写基于AbstractList的新列表实现 - 您需要知道是否需要覆盖addAlladd,或者是否只需要覆盖add

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

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

  • 你可以简单地避免自我使用。
  • 您可以使其中一种方法final,因此无法覆盖。
  • 您可以上课final,因此无法进行扩展。
  • 您可以在其Javadoc评论中描述该类的自用模式(满足让其他人知道的要求)。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

他描述了所谓的自用模式,就我所说的而言   我们不能在其他可覆盖的内部使用可覆盖的方法   方法

     

/ **   *此类是自用的,因此无法继承。   * /

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

public final class MyClass{

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

    public void ovMe(){
         //some staff
    }
}

如果您将方法标记为final,则不再是overridable,因此它不符合您在问题中提供的说明。

答案 3 :(得分:1)

您的课程应为final课程。

例如,您可以跟进String类,您无法覆盖任何方法。