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