有没有人在Checkstyle中看到DesignForExtension Check中的原因?

时间:2013-10-26 03:49:46

标签: checkstyle

检查: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/

看起来所有切换都在其配置中检查。

是否有人可以显示此检查有用的实际代码示例? 它对实践中的开发人员有用吗,而不是理论上的?

1 个答案:

答案 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的设计者仍然处于控制之下,仅为子类提供特定的钩子。如果hookabstract,则TheirSubClass将被强制提供实施。如果它只是一个空方法,TheirSubClass可以选择不使用钩子。

Checkstyle的Check是为扩展而设计的类的真实示例。具有讽刺意味的是,它仍然无法通过检查,因为getAcceptableTokens()public而不是final