您链接到的文档已经解释了检查背后的理由。这在某些情况下很有用。在实践中,我从来没有打开过它,主要是因为它管理起来太麻烦了,而且你当然不希望在所有课程中都使用它。
但是您要求提供代码示例。考虑这两个类(YourSuperClass
是您提供的 API 的一部分,TheirSubClass
由您的 API 的用户提供):
public abstract class YourSuperClass
{
public final void execute() {
doStuff();
hook();
doStuff();
}
private void doStuff() {
calculateStuff();
// do lots of stuff
}
protected abstract void hook();
protected final void calculateStuff() {
// perform your calculation of stuff
}
}
public class TheirSubClass extends YourSuperClass
{
protected void hook() {
// do whatever the hook needs to do as part of execute(), e.g.:
calculateStuff();
}
public static void main(final String[] args) {
TheirSubClass cmd = new TheirSubClass();
cmd.execute();
}
}
在这个例子中,TheirSubClass
不能改变工作方式execute
(做事,调用钩子,再做事)。它也不能改变calculateStuff()
方法。因此,YourSuperClass
它是“为扩展而设计的”,因为TheirSubClass
它不能破坏它的运行方式(就像它可能一样,如果execute()
不是这样的话final
)。的设计者YourSuperClass
保持控制,只提供特定的钩子供子类使用。如果hook
是abstract
,TheirSubClass
则强制提供一个实现。如果是单纯的空方法,TheirSubClass
可以选择不使用钩子。
CheckstyleCheck
是一个为扩展而设计的类的真实示例。具有讽刺意味的是,它仍然无法通过检查,因为getAcceptableTokens()
ispublic
但 not final
。