2011-10-23 9 views
0

Javaでこの演算子に関する質問があります。プログラマは、このようなコードを記述した場合には:Java - 'this'演算子

private int counter; 

public Incrementor(int counter){ 
this.counter = counter; 
} 

効果をシャドーイングを回避し、これで行く方が良いでしょう:

private int counter; 

public Incrementor(int startValue){ 
counter = startValue; 
} 

この演算子ではないでしょう、この演算子を作ります将来のプログラミング放棄では廃止されましたか?

+18

あなたは13の質問をしましたが、あなたはそれを受け入れませんでした! –

+7

'this'は演算子ではありません。 –

+0

'if(someObject == this)...'のようなコードを書く必要があるかもしれませんし、内部クラスの外部クラスの 'this'を参照することもできます。 – Vlad

答えて

4

"this"キーワードは非常に便利です。あなたの例ははっきりしていますが、外部参照の別のメソッドに自己参照を渡す必要がある状況を想像してください。

1

場合によっては、オブジェクト自体を渡す必要があります。それはthisを使用したときです。

+2

フィールドと同じ名前の引数がない場合は使用しないでください。 – ObscureRobot

+1

フィールドを参照するために 'this'を使用することは絶対に冗長ではありません。元の質問はこれを示しています。たとえそれが重複していたとしても、コードの明瞭性のために役立ちます。 – idbentley

+0

さて、大丈夫、どういうわけか私はこのためにフラークを得るだろうことを知っていた。次に、明示的に 'this'を使ってフィールドに印を付けることは、私がJavaでのみ見たものです。 C++ではなく、C#ではありません。なぜ私は不思議です。 –

4

は、現在のオブジェクトへの参照です。あなたの例では、this.counterはクラスで定義されたカウンタ変数を意味し、メソッド引数counterはコンストラクタのローカル変数です。

ここでの主なアイデアは、現在のオブジェクトの変数を使用していることを明示することです。したがって、コードの可読性と理解度が向上します。

また、thisは演算子ではありません... 現在のオブジェクトへの参照です。

3

ほとんどのプログラマーは同じ名前を使うのが好きです。 thisでクラス変数を参照するのを忘れるのは難しいですか?

+1

ほとんどのプログラマーが好むことは必ずしも偉大な習慣ではありません。 – ObscureRobot

3

最初の例ではシャドーイングはありません。 thisは、クラス変数を参照するための非常に明確な方法です。

2

私は最初のものを使用します。コードを読みやすくします。 また、メソッド setCounter()の名前を付けてください。これもまた、可読性 になります。

Methodsセクションhereに概説されているように、命名方法のJavaコーディング規約を守ることが別の関連しない点です。

編集:これは方法ではありませんでした。おっとっと!

+0

+1はJavaコーディング規約に言及しています。 JCCで*開始*し、必要に応じてニーズに合わせて変更することをお勧めします。 – ObscureRobot

4

thisよりシナリオで使用されている:

  • それは、現在のオブジェクトは、内側から参照されることを可能にする方法foo.add(this)
  • への引数として、オブジェクトを渡すことができフィールド
  • からローカル変数を区別することができクラス:Outerclass.this
  • 同じクラスの他のコンストラクタを呼び出すために使用されます。this()
2

小規模な方法では、割り当てられるメンバと同じ名前を引数に付けるほうが明らかです。より大きな方法で作業している場合、これは混乱する可能性があります。しかし、適切な決定が引数の名前を変更するか、メソッドをサブ関数に分解するかどうかを評価する必要があります。

3

私はそれを見て、これはクラス変数のためにそれをやっているとき、これは良いプログラミングの慣行の問題です。

コード等:

private int counter; 

public Incrementor(int startValue){ 
counter = startValue; 
} 

private int counter; 

public Incrementor(int counter){ 
this.counter = counter; 
} 

対は、10行にを推定し、最初のものは、はるかに読み取り可能です。さらに、リファクタリングコードを簡単にします。

それ以外の場合、 'this'は特別な意味を持ちます。 'this'キーワードは、クラス内の現在のオブジェクトを指し、オブジェクト指向の原則に沿っています。 getterやsetterの場合には非常に有用で意味があります。

追加されました:あなたが継承して作業を開始したら

、あなたは大幅に継承された属性とクラス内のローカルなものを区別することができます「スーパー」と呼ばれる別のキーワードに気づくでしょう。