Javaで「this」キーワードを使用するために受け入れられているスタイルは何ですか?


37

私はPythonやJavascript(およびオブジェクト指向ではない他の言語)の出身であり、Javaの実用的な知識を向上させようとしています。

常にthis現在のインスタンス属性の先頭に追加するのは悪い習慣と見なされますか?書くほうが自然に感じます

...
private String foo;

public void printFoo() {
    System.out.println(this.foo);
}
...

より

...
private String foo;

public void printFoo() {
    System.out.println(foo);
}
...

インスタンス属性とローカル変数を区別するのに役立ちます。

もちろん、Javascriptのような言語では、よりthis多くの関数をネストできるため、常に使用する方が理にかなっています。したがって、ローカル変数はより大きなスコープから取得されます。Javaでは、私が理解している限り、このようなネストは不可能です(内部クラスを除く)。したがって、おそらく大きな問題ではありません。

いずれにせよ、私は使用したいと思いますthis。風変わりではなく、奇妙に感じますか?


当社では、ツールを使用してそれを標準化します。ツールは、会社のポリシーに応じて、これを使用せずにコードをリライトします。だから、誰もが好きなようにコード化し、コードはコミット時に正しい方法でフォーマットされます。
deadalnix

2
「より多くの関数をネストできるため、ローカル変数はより大きなスコープから取得されます。」また、「this」は実際にはJSの関数内で修飾されていない変数が由来する場所の1つではないという事実です。
Random832

2
すべてのインスタンス変数の前にアンダースコアを付けるので、を使用せずにローカル変数とインスタンス変数の違いを簡単に確認できますthis
-WuHoUnited

4
C#では、StyleCopはthis.、メンバー変数、メソッドなどを参照するときに配置することを望んでいます。それが気に入っています。このルールに同意します。最初にアンダースコアを付けて名前を付けるよりも良いと思います。Javaでコーディングしている場合、同じ規則に従います。
ジョブ

回答:


40

ほとんどのIDEでは、知りたい場合は変数にマウスオーバーするだけです。さらに、実際には、インスタンスメソッドで作業している場合は、関係するすべての変数を本当に知っている必要があります。数が多すぎる場合、または名前が衝突する場合は、リファクタリングする必要があります。

本当に冗長です。


7
また、健全なIDEでは、フィールドとローカル変数/パラメーターを視覚的に区別する必要があります。たとえば、Eclipse(デフォルト)のフィールドは青で、ローカル変数は黒です。
ヨアヒムザウアー

1
@Joachimナイスポイント、Eclipseはユーザーが望むならパラメーターとローカル変数を異なる色にすることさえできます(しかしこれはデフォルトではありません)。
エリックカール

3
私は同意しますが、他の開発者のコ​​ードに出くわすとき(そして、一見不慣れである間)、私this.ははるかに役立つことがわかります。これはおそらく、ローカル変数/オブジェクト変数を異なる方法で色分けするIDEがないためです。
ブラッドクリスティ

3
(言い換え)「これがメンバーであると推測するためにこれを使用する必要がある場合にリファクタリングする」ための+1 。私が指摘したかったもの。
ヤムマルコビッチ

私はそれが読みにくくなるとは思いませんし、見返りに、コードはフィールドとローカルを区別しない洗練された構文ハイライトを持たないエディターで読みやすいままです。私は常に、最も基本的なテキストエディターでコードを読みやすくするために努力する必要があると考えてきました。そうでない場合は、十分な理由があるはずです。
ケビン

26

を使用することを好みますthis。ローカル変数とインスタンス変数を同じように色付けするさまざまなエディターでコードを読みやすくします。また、コードのレビューなどの際に、印刷されたページのコードを読みやすくします。また、他の開発者への変数のスコープについてもかなり強力なリマインダーです。

ただし、これには反対意見があります。最近のIDEでは、変数の上にマウスを置くか、ツリーのような構造で表示することにより、変数のスコープを見つけることができます。また、スコープに応じて変数の色やフォントを変更することもできます(印刷時に変数のスコープが明らかであるような方法でも)。

私は、ChrisFの最後の文章まだ終わっていないと信じています。


7
「また、他の開発者に対する変数の範囲についてもかなり強力なリマインダーです。」-私が使用する傾向がありthis.、コードで見たい理由。書くのに0.5秒かかり、20リビジョン前にその直前の変更バーストを行ったときにあなたの前の男が実際にキャメルケースのローカルではなくpascal-caseプロパティを使用するつもりだったかどうかを把握しなければならない場合、長い時間を節約できます。
scrwtp

18

私が一貫して「これ」を使用する場所の1つは、セッターまたはコンストラクターです。

public void setFoo(String foo) {
    this.foo = foo;
}

それ以外は、追加する必要はないと思います。メソッドの本体を読むとき、パラメータとローカルはすぐそこにあり、(IDEの助けがなくても)簡単に追跡できます。また、ローカルとフィールドは性質が異なる傾向があります(オブジェクトの状態と一時的なストレージまたはパラメーター)。

何が変数で何がフィールドであるかについて混乱がある場合は、おそらくメソッドに多すぎる変数/パラメーターがあり、長すぎて複雑すぎて、単純化する必要があることを意味します。

フィールドのタグ付けに「this」を使用することを選択した場合、規則が常に厳密に従うことを確認することをお勧めします。「this」がローカルではないことを前提とし、仮定に基づいて物事を壊すことは本当に簡単です。

編集:私はまた、これをequals、clone、または同じオブジェクトタイプの「that」パラメータを持つもので使用します:

public boolean isSame(MyClass that) {
    return this.uuid().equals(that.uuid());
}

8

議論の余地があります。

それは、我々はC#StyleCopが追加主張デフォルトルールを持っていることを見つけるのJavaと非常に似た構文と構造を持っているようアナロジーとしてのC#を取るthisが、ReSharperのは、と言っているデフォルトのルールがあるthis冗長である(それはある)とすることができます削除されました。

したがって、あるツールを使用している場合は追加しますが、別のツールを使用している場合は削除します。両方のツールを使用している場合、いずれかのルールを選択して無効にする必要があります。

ただし、ルールの意味するところは、使用法が一貫していることです。これはおそらく最も重要なことです。


8

これを常に現在のインスタンス属性の先頭に追加するのは悪い習慣と見なされますか?

はい-一部の人、いいえ-他の人。

thisはJavaとC#のプロジェクトでキーワードを好み、使用しています。IDEは常にパラメーターとフィールドを異なる色で強調表示するが、IDEで常に動作するとは限らない-メモ帳で多くのマージ/差分/いくつかの迅速な変更を行う/電子メールのコードスニペットをチェックする必要がある。それはだ方法、例えば、いくつかの可能な同時実行の問題を検討するために-私は、インスタンスの状態が変更された第一印象から発見しやすいです。


7

これを使用する必要がある場合、メソッドが長すぎるか、クラスが多すぎるか、またはその両方があると思います。

メソッドは数行のコードよりも長くならないようにし、1つまたは2つのローカル変数を使用して、何が簡単になるかを決定します。ほとんどのdiffツールの3行のコンテキストのみでさえ。メソッドが長すぎて、クラスの責任が多すぎる(多くの場合、フィールドが多すぎることを意味する)場合、解決策は代わりにそれらを分割することです。

「これ」はコードを混乱させるだけだと思います。特に、ローカルパラメータ/ローカル変数/フィールドに異なる色を付ける最新のIDEでは。


5

あなたはこれであなた自身の質問に答えたと思います

書くほうが自然に感じます

... this.foo ...

より

... foo ...

インスタンス属性とローカル変数を区別するのに役立ちます。

this.Javaでの作業知識を向上させながら使用する方が快適であれば、必ず使用してください(何らかの意味で、あなたが関係しているお馴染みのPythonの自己だと思います)。

問題は、人々はを使用するか使用しないかについて堅実な/適切な議論をするがthis.、それでも議論のように聞こえるということです。

  • それは、変数の目的が明確に各変数が何であるかはっきりしていない場合は、コードを書き換える必要があります。
  • this.IDEであなたの全体の一日を過ごす場合に冗長である私が強調していない構文を使用して、コンパレータを使用して、異なるバージョンのコードレビューやメイク差分を行います。
  • 入力しないthis.利益を、私は、生産性の重要ミリ秒私はキーによって繰り出さ取得が押され、追加することはthis.昇給のようなものです:D。
  • などなど

しかし、肝心なのは、一日の終わりに、個人の好みと職場環境にまだ戻っているということです


5

通常、これを追加する必要はありません。私はそれはそれ自体が悪い習慣だとは思わないが、の過度の使用、これはおそらく私が見てきたことをほとんどのJavaコードベースでは珍しいと考えられます。

ただし、いくつかの特定の状況では価値があります。

ローカルパラメータのオーバーライド -場合によっては、同じ名前のパラメータ/ローカル変数ではなく、インスタンス変数を使用するように指定する必要があります。これは、コンストラクターでは非常に一般的です。コンストラクターでは、初期化に使用されるインスタンス変数の内部名とパラメーター名を一致させる必要があります。

class MyObject {
  int value;

  public MyObject(int value) {
    this.value=value;
  }
}

同じクラスの他のインスタンスを処理する場合 -参照しているクラスのインスタンスを明示することで、コードがより明確で理解しやすくなると思います。

class MyObject {
  int value;
  ....

  public MyObject add(MyObject other) {
    return new MyObject( this.value + other.value )
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.