是否应启用RequireThis检查Checkstyle?

mat*_*ele 6 java checkstyle

其中一个内置的Checkstyle检查是RequireThis,只要你没有预先添加this.到本地字段或方法调用,它就会关闭.例如,

public final class ExampleClass {
    public String getMeSomething() { 
        return "Something"; 
    }

    public String getMeSomethingElse() {
        //will violate Checkstyle; should be this.getMeSomething()
        return getMeSomething() + " else"; 
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力解决这个检查是否合理的问题.在上面的例子中,ExampleClass是final,它应该保证getMeSomething应该调用"正确"的版本.此外,似乎有些情况下您可能希望子类覆盖默认行为,在这种情况下,要求"this"是错误的行为.

最后,似乎过于防御性的编码行为只会使源头变得混乱,并且更难以看到实际发生的事情.

所以在我向我的架构师建议这是一个不好的启用检查之前,我想知道是否有其他人启用了这项检查?你是否因为失踪而发现了一个严重的错误this

Ten*_*she 5

RequireThis规则确实有一个有效的用途,因为当它应用于字段时,它可以防止方法和构造函数中可能出现的错误下面的代码几乎肯定是一个错误:

void setSomething(String something) {
    something = something;
}
Run Code Online (Sandbox Code Playgroud)

这样的代码可以编译,但除了将方法参数的值重新分配给自身之外什么也不做。更有可能的是,作者有意这样做:

void setSomething(String something) {
    this.something = something;
}
Run Code Online (Sandbox Code Playgroud)

这是一个可能发生的拼写错误,值得检查,因为如果代码由于this.something稍后在程序中没有设置而失败,它可能有助于防止难以调试的问题。

checkstyle 设置允许您保留对字段的这种有用的检查,同时通过配置如下规则来省略对方法的基本上不必要的检查:

   <module name="RequireThis">
       <property name="checkMethods" value="false"/>
   </module>
Run Code Online (Sandbox Code Playgroud)

当涉及到方法时,这条规则没有实际作用,因为调用this.getMeSomething()or 只是getMeSomething()对 Java 的方法解析没有影响。当方法是静态时调用this.getSomethingStatic()仍然有效,这不是错误,它只是各种 IDE 和静态分析工具中的警告。