java - 设计继承类

标签 java inheritance

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

所以我的问题是如何让客户意识到 self 使用。我们是否应该像这样在 Javadocs 中明确提及它:

/**
* This class is self-use, thus it cannot be inherited.
*/

或者我们甚至应该拒绝自用的诱惑。

示例代码: 我们应该像我上面描述的那样记录该类还是必须避免这种自用?

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 个月后的您)。

关于java - 设计继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31110324/

相关文章:

c# - 在 C# 中有条件地调用重写的基方法

java - 我们可以根据 id 以外的任何其他唯一字段更新 Keycloak 中的用户吗?

javascript - 重命名子类中的父类属性

javascript - 从另一个实例更新实例的属性

java - 如何以自定义格式在 JSF 按钮上显示日期作为标签?

java - 子类是否继承父类(super class)的私有(private)实例变量

c++ - 派生赋值运算符从基数调用

java - 将这两个类提取到公共(public)类的最佳实践是什么?

java - 请求依赖 bean 注入(inject)

java - 当选择根目录后,您有一个带有不可选中框的项目时,如何在 Eclipse 中导入项目?