7

組み込みのCheckstyleチェックの1つは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はfinalであり、「正しい」バージョンが呼び出されることを保証する必要があります。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>

メソッドに関しては、このルールは実際には効果がありません。これは、Javaのメソッド解決を呼び出すthis.getMeSomething()か、まったく効果がないためです。getMeSomething()メソッドが静的である場合でも呼び出しthis.getSomethingStatic()は機能します。これはエラーではなく、さまざまなIDEおよび静的分析ツールでの警告にすぎません。

于 2009-11-09T16:45:21.470 に答える
4

私は間違いなくそれをオフにします。Usingthis.foo()は慣用的な Java ではないため、必要な場合にのみ使用して、コード内で何か特別なことが行われていることを知らせる必要があります。たとえば、セッターでは次のようになります。

void setFoo(int foo) {this.foo = foo;}

これを不当に使用するコードを読むとき、私は通常、オブジェクト指向プログラミングをしっかりと把握していないプログラマーにマークアップします。主な理由は、これがどこでも必要なわけではないことを理解していないプログラマーからのコードのスタイルを一般的に見たからです。

これが CheckStyle のライブラリのルールになっていることに、率直に言って驚いています。

于 2009-11-09T16:36:14.390 に答える
3

「これ」で呼びます。これは「このクラス」ではなく「このオブジェクト」を参照するため、サブクラスでオーバーライドされたメソッドの呼び出しを停止しません。ただし、静的メソッドをインスタンス メソッドと間違えないようにする必要があります。

正直なところ、それは特に一般的な問題のようには聞こえません。個人的には、トレードオフの価値があるとは思いません。

于 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 に答える