Java 为继承设计类

Java 为继承设计类,java,inheritance,Java,Inheritance,我正在阅读J.Bloch的有效Java,现在我在为继承设计类一节。他描述了所谓的自用模式,据我所知,我们不能在其他可重写方法中使用可重写方法 所以我的问题是如何让客户意识到自我使用。我们是否应该在Javadocs中明确提到它 /** * This class is self-use, thus it cannot be inherited. */ 或者我们甚至应该拒绝自用的诱惑 示例代码: 我们应该像我上面描述的那样记录这个类,还是必须避免这种自我使用 public class MyClass

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

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

/**
* This class is self-use, thus it cannot be inherited.
*/
或者我们甚至应该拒绝自用的诱惑

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

public class MyClass{

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

    public void ovMe(){
         //some staff
    }
}
也许,您可以使用方法或类的

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

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

防止程序员不重写
可重写的
方法(非final)的唯一方法是将类标记为
final
,并防止继承该类

public final class MyClass{

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

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

如果将某个方法标记为
final
,则该方法不再是
可重写的
,因此它不符合您在问题中提供的描述。

您的类应该是
final


例如,您可以在不能重写任何方法的
String
类后面执行操作。

如您所述,自用是当一个可重写方法调用另一个可重写方法时。例如,调用
AbstractList.add

确保任何扩展类的人都知道这一点很重要。假设您正在基于
AbstractList
编写一个新的列表实现—您需要知道是否需要同时覆盖
addAll
add
,或者是否只需要覆盖
add

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

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

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

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

如果您不希望重写某个方法,请不要在注释中以关键字的形式给出一点提示。用
final
@St.Antario强制执行它并非每个人都随身携带有效的Java副本。请引用相关段落和随附的任何代码示例。这是第17项“为继承而设计和编写文档,否则禁止”@ChetanKinger您希望我引用什么?我认为问题中的描述就足够了。不确定你在问什么,如果你不编辑你的问题,你会被其他人否决。他描述了所谓的自用模式,据我所知,我们不能在其他可重写方法中使用可重写方法。从什么时候起,
final
方法成为可重写的?我们可以将其中一些方法组合在一起吗?例如,记录和声明final.@St.Antario如果你的类或方法是final的,那么任何人都无法重写你的方法,因此他们没有理由关心自用。@St.Antario这正是我要求你引用本书相关章节的原因。你的问题断章取义。特别是他描述的所谓自我使用模式的陈述,据我所知,我们不能在其他可重写方法中使用可重写方法,这是断章取义的,因为可重写的方法不能是最终的。