2011-01-09 3 views
9

私はいつも疑問に思ったことがあります。 '[NAME]'または単に[NAME]のどちらかを使用してメンバーを参照することができるクラスで、これが優先されますか? Javaで例えばOOPでは、クラス内で「this」を使用することに関するベストプラクティスは何ですか?

public class foo { 
    public int bars = 0; 
    private void incrementBars(){ 
     bars++; 
    } 
} 

public class foo { 
    public int bars = 0; 
    private void incrementBars(){ 
     this.bars++; 
    } 
} 

は、同じ効果を持っている 'ように見えます'。

for (foo f : listOfFoos){ 
    f.incrementBars(); 
} 

、まだ動作しているようです:私は、クラスfooの複数のインスタンスをインスタンス化のケースでは

は、私がこれまでのところ、のような何かを、と思います。

これは技術的に曖昧ですか?その場合は、好ましい方法がありますか?

+7

どちらのアプローチも同じ効果を持つようには見えないことに注意してください。実際にはそうしています。 'this.'はインスタンスメンバーにアクセスする際に暗黙のうちに指定され、コンパイルされたバイトコードはどちらの構文でも同じになります。 – cdhowie

+0

""これです。コンパイルされたバイトコードはどちらの構文でも同じになります " - Oooooooh :) – Danedo

答えて

15

thisの場合はvariable shadowingの場合。

class MyClass{ 
     int i;//1 
     public void myMethod(){ 
      i = 10;//referring to 1  
     } 

     public void myMethod(int i){//2 
      i = 10;//referring to 2 
      this.i = 10 //refering to 1  
     }  
    } 

もいつかthisはあなたが確実とあなたがフィールドを扱っていることを通信するthisを使っによる英語の考え方

+4

個人的に私は' this.' *常に*より読みやすくなっています。それは一貫性を導入する。その変数は、コンテキストに関係なく、オブジェクトのメンバーであることを確認できます。 –

+0

@Felixはい、それは英語の 'this'をシミュレートするので簡単になります –

+1

@Felixはより意味的な意味を持っていると考えていましたが、変数を視覚的に目立つようにし、読むテキストが増えている間は、変数に関する直接的な情報が得られます。私は自分自身を使用して、 "これ"を体系的に使用しないで使い切っています。私がまともな言語をサポートしているIDEまたはエディタを使用しているときは、明らかに過度のことです。しかし、白黒テキストでコードを読むことに戻ると、それは大いに役立ちます。それは単なる習慣です。 – haylem

3

に、コードをより読みやすくなります。

それはあなたが非常にsuccintある

public void setX(int x) { 
    this.x = x; 
} 

のようなセッターを書くことができます。

2

唯一の時間this.は、現在のスコープにも同じ名前の変数がある場合です。すべてのクラス変数には、_variableという規則を使用することをお勧めします。このようにしてthis.を使用する必要はなく、誤ってクラス変数に触れることはありませんでした。

5

あいまいさはありません。存在した場合、にはがあり、thisを使用しています。

わかりやすくするために、一部の人にはthisをお勧めします。それ以外の場合は、「ノイズ」が発生するため、必要でないときは反対することをおすすめします。現代のIDEやエディタの中には、構文強調を使用して、引数を分かりやすくするためにフィールドとは異なる(たとえば)引数を付けることができます。

個人的にはthisを避けて@unholysampler's underscore conventionを使用します。あなたの同僚と何かを同意し、あなたのコーディング基準に入れてください。

0
class Test 
{ 
    private int value; 

    public Test(int value) 
    { 
    // This is wrong 
    // value = value 

    // This is right 
    this.value = value; 
    } 
} 

ローカル変数によって非表示になっているメンバー変数にアクセスするには、「this」を使用します。 は、「これは」OUがこれを行うことができ、現在のオブジェクトへの参照のみですので:

doSomething(this); 

これらは、基本的にあなたがこれを使用する必要があります唯一の方法です。

+0

最後に、あなたのロジックによって、 'private'を使うことは、すべての可能なユースケースでは冗長です。何の宣言もそれがなければ"正しい "でしょう。 'フィールド宣言。私はメソッドの呼び出しコンテキストで 'this.'を使うことをお勧めしていると言っているわけではありません、あなたは自分の推論と矛盾していることを指摘しています。 – cdhowie

+0

method()の代わりにthis.method()を使用するのは、同じバイトコード/マシンコードでコンパイルされるため冗長ですが、これを行う理由は純粋に文法的です。 – user434565

+0

しかし、変数をprivate対protectedとしてマークすると、多くの場合に必要な継承されたクラスから変数が隠されます。 – user434565

0

可変シャドーイングの場合を除いて、技術的にはあいまいです(ジガール氏の答えで指摘されています)。

ほとんどの場合、クラス構造の構文の強調表示を非常によく知っているエディタ/ IDEで作業すると、変数がオブジェクト内のフィールドであるか、メソッド内で定義された変数かどうかがわかります。しかし、より純粋なテキストエディタ(vimなど)では、構文の強調表示はこれを明確にしません。

これは私が通常のIDEの外でコードを読んでいることを知っているので、オブジェクトに属するすべてのフィールドを参照するのにthis.fieldを使用する方が好きです。それは少し冗長ですが、それは私が気にしないトレードオフです。

0

質問の最初の2つのサンプルはまったく同じものです。属性はローカル変数の影されたときにthisが必須であるところだけがある:

public class Test { 
    private int a; 

    public void noShadow() { 
     System.out.println(a); // attribute 
    } 

    public void shadow(int a) { 
     System.out.println(a); // parameter 
     System.out.println(this.a); // attribute 
    } 
} 

今私は、現代のIDEは、高度な構文の強調表示を提供し、特にとして、絶対的なベストプラクティスがあるとは思いません。たとえば、_m_などのような属性を接頭辞として使用し、thisを使用しないようにするものがあります。ある者はthisの使用を必須とし、属性に命名規則を追加しないことを好みます。あなたがしようとしていることは、既存のコードまたは既存のコーディング標準に大きく依存します。私は、コーディングの標準がプロジェクトで働くすべての人々にとって同じであることを保証するものは何もありません。

関連する問題