检查:http://checkstyle.sourceforge.net/config_design.html#DesignForExtension
误报:Checkstyle "Method Not Designed For Extension" error being incorrectly issued? checkstyle Method is not designed for extension - needs to be abstract, final or empty https://sourceforge.net/p/checkstyle/bugs/688/
看起来所有切换都在其配置中检查。
是否有人可以显示此检查有用的实际代码示例? 它对实践中的开发人员有用吗,而不是理论上的?
答案 0 :(得分:3)
您链接的文档已经解释了检查背后的基本原理。这在某些情况下很有用。在实践中,我从来没有打开它,主要是因为它管理起来太麻烦了,你当然不希望它用于所有你的课程。
但你问了一个代码示例。考虑这两个类(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
可以选择不使用钩子。
Checkstyle的Check
是为扩展而设计的类的真实示例。具有讽刺意味的是,它仍然无法通过检查,因为getAcceptableTokens()
是public
而不是final
。