2017-12-02 8 views
1

私はthisキーワードについていくつかのガイダンスを探しています。私はちょうどそのコンセプトについて学びました。それは私にとっては紛らわしいものです。ここに私のコードの一部です:私のコードで 'this'キーワードを正しく使用していますか?

public class CashRegister { 
    private ArrayList<Double> items; 
    private int itemCount; 
    private double totalPrice; 

     public double getTotal() { 
      this.totalPrice = 0; 
      for (int i = 0; i < this.items.size(); i++) { 
       this.totalPrice = this.totalPrice + this.items.get(i); 
      } 
      return totalPrice; 
     } 
    } 

私は 'この'権利を使用していますか? totalPriceitems ArrayListのような変数を使うたびに 'this'を使うべきですか?

+1

私はいないだろう。それは冗長であり、言語を理解する人は誰でも 'totalPrice'がインスタンスフィールドを参照することを知っています。 – markspace

+0

この場合、これらは必要ありません。このキーワードは、競合の可能性がある場合に使用されます。ここで、getTotal()で参照される唯一のオブジェクトは、それを呼び出すために使用されるオブジェクトです。したがって、私はどのオブジェクトの属性についての参照で競合することはありません。 –

+0

私はそれが好きです。私にとっては、紛争を防ぐ方法の1つです。別の方法は、名前の競合を全く作成しないことです。例えば、メンバに 'mTotalPrice'のような接頭辞を与えることによって(例えば、他の言語では' _totalPrice'のように)。 IDEで作業している場合、 'this'を使用することを忘れた場合や、このような名前の競合を作成した場合(少なくともEclipseにはこれがあります)、警告するような高度なルールを設定できます。 – Zabuza

答えて

2

間違っていません。しかし、それは重複しているのでコードを汚染しています。 itemstotalPriceは、現在のオブジェクトのフィールド(これによって参照される)です。ここで

thisは理にかなっているコードの一部です:

public class Test { 
    private String test; 

    public Test(String test) { 
     this.test = test; 
    } 
} 

あなたはtestへの参照があいまいであることを見ることができます。 testを使用している場合は、Testのオブジェクトのフィールドにアクセスしているか、コンストラクタに渡された参照Stringのフィールドにアクセスしているかは分かりません。この場合、参照にアクセスします。したがってthisは、タイプTestのオブジェクトのフィールドを使用していることを確認するために使用されます。

shadowingという概念があります。 thisを使用すると、そうでないときに何かを参照しているという考えの罠に陥るのに役立ちます。

この質問は役立ちます。 What is variable shadowing used for in a Java class?

+0

ありがとう、あなたのコードはオブジェクトの例ですか? – WizKid22

+0

@ WizKid22実際は、Testというクラスの定義です。 Test t1 = new Test( "abc")のようにインスタンス化します。次に、t1はTest型のオブジェクトになります。クラスを青写真とし、オブジェクトを実際の建物と考えてください。 – wleao

1

thisの使用方法は間違いではありませんが、冗長です。同じコードをthisなしで作成しても同じ結果が得られます。

+0

あなたはあまりにも速かった!笑 – wleao

1

一般に、「this」の最も一般的な使用法はオブジェクトコンストラクタです。ですから、...のようないくつかのものを持っている可能性が

だから、主にあなたが渡される引数を代入していたとのオブジェクトを識別するために使用されます
public NewThing(int count, double price) { 
    this.count = count; 
    this.price = price; 
} 

。変数名が引数と同じであるため、 "this"はそれらの属性を受け取る "this object"であることを知らせます。

関連する問題