7

内置的 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"; 
    }
}

我正在为这种检查是否合理而苦苦挣扎。在上面的例子中,ExampleClass是最终的,它应该保证getMeSomething应该调用的“正确”版本。此外,在某些情况下,您可能希望子类覆盖默认行为,在这种情况下,要求“this”是错误的行为。

最后,这似乎是一种过度防御性的编码行为,只会使源代码变得混乱,并且更难看到实际发生的事情。

因此,在我向我的架构师建议启用这是一个错误的检查之前,我想知道是否有其他人启用了此检查?您是否因丢失而发现严重错误this

4

5 回答 5

5

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

void setSomething(String something) {
    something = something;
}

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

void setSomething(String something) {
    this.something = something;
}

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

checkstyle 设置允许您保留对字段的有用检查,同时通过配置如下规则省略大部分不必要的方法检查:

   <module name="RequireThis">
       <property name="checkMethods" value="false"/>
   </module>

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

于 2009-11-09T16:45:21.470 回答
4

我肯定会关掉它。Usingthis.foo()是非惯用的 Java,因此只应在必要时使用,以表明代码中正在发生一些特殊情况。例如,在 setter 中:

无效 setFoo(int foo) {this.foo = foo;}

当我阅读无缘无故使用它的代码时,我通常会将其标记为没有牢牢掌握面向对象编程的程序员。主要是因为我通常看到程序员的这种代码风格,他们不明白这并不是到处都需要的。

坦率地说,我很惊讶地看到这是 CheckStyle 库中的一个规则。

于 2009-11-09T16:36:14.390 回答
3

用“这个”打电话。不会阻止调用调用子类中的重写方法,因为 this 指的是“this object”而不是“this class”。不过,它应该可以防止您将静态方法误认为实例方法。

老实说,这听起来不是一个特别常见的问题,我个人认为不值得进行权衡。

于 2009-11-09T16:29:44.530 回答
3

我个人不会启用它。主要是因为每当我阅读代码时,我都会在 IDE(或其他进行智能代码格式化的东西)中阅读它。这意味着不同类型的方法调用和字段访问是基于它们的实际语义含义而不是基于某些(可能是错误的)指示来格式化的。

this.编译器不需要,当 IDE 进行智能格式化时,用户也不需要。编写不必要的代码只是此代码中的错误来源(在此示例中:this.在某些地方使用而在其他地方不使用它)。

于 2009-11-09T16:30:23.023 回答
1

我将只对字段启用此检查,因为我喜欢在this.字段前面添加的额外信息。
请参阅我的(旧)问题:您是否在 java 中为您的实例变量添加 'this' 前缀?.

但对于任何其他项目,尤其是遗留项目,我不会激活它:

  • 很有可能,关键字“ this.”几乎从未使用过,这意味着此检查会产生大量警告。
  • 命名覆盖(如具有相似名称的字段和方法)非常罕见,因为当前 IDE 默认情况下标记该代码并带有自己的警告。
于 2009-11-09T16:42:22.220 回答