2011-10-18 9 views
4

私はちょうどthisの使用について興味があります.Androidのサンプルコードとドキュメントではthisキーワードを使用していないためです(アンドロイドエンジニアは一般的にスマートなので、 )。私は、アンドロイドのエンジニアがthisをあまり使わない根本的な理由を知りたいだけです。Javaで `this`を使うのは悪い習慣ですか?

+0

あなたは* this *なしでは暮らすことができない例を教えてください。 – Gleno

+0

を使って 'this'はアンドロイドについて確信していない良い練習です。キーバリューコーディングに何かがあるかもしれません。 – Shahzeb

+0

私はそれなしで暮らすことができると思いますが、個人的に、私はこれを使いやすくしています。それは私にとって明白なので、より明確にします。 – cesar

答えて

7

主に文体の違いです。私はまだそれが良いか悪いかという議論を見てきました。個人的に私はそれを使用したいと思うし、あなたがそれを使用する必要があるときにはいくつかの例があります。

たとえば、親クラスのメソッドを呼び出すAnonymous Innerクラスがある場合は、thisが必要です。例:

class MyClass{ 
    protected void doSomething(){ 

    } 

    OnClickListener n = new OnClickListener(){ 
     public void onClick(View v){ 
      MyClass.this.doSomething(); 
     } 
    }; 

} 

thisの別の理由は、メソッド引数がメンバ変数をマスクするかどうかです。その場合は、thisを使用して2つを区別することができますが、引数をマスキングしないものに変更することをお勧めします。そのインスタンス内から現在のクラスのインスタンスへのポインタを渡すときthisを使用する

class MyClass{ 
    protected int val; 

    public void setVal(int val){ 
     this.val = val; // set the member variable equal to the method argument 
    } 

} 

もう一つの理由です。この例では、新しいIntent

Intent i = new Intent(this, NewActivity.class); 

を作成するときにthisを使用する必要がありますおそらくより多くの場所があります。これらは、頭に浮かぶ最初の数です。

+0

これは、現在のインスタンスの一部にアクセスして、ローカルスコープ内の何かに隠れている場合にのみ必要です。 OnClickListenerには、MyClass#doSomething()を隠すdoSomething()がないため、内部クラスでは必要ありません。 – jackrabbit

1

これは問題ではありませんが、コードで 'this'を使用する場合は、どこでも使用してください。それはあなたのコードを明確にします。

0

これは悪い習慣よりも個人的な味です。

0

いいえ、アンドロイドのサンプルコードには「this」への参照がありますが、これを悪い習慣と考える理由はありません。しかし、多くの時間は不必要であり、簡潔さのために省略されている可能性があります。

たとえば、定義されているクラス内からmethodA()を呼び出すと、this.methodA()として呼び出すことができます。これは、あなたが電話をかけるときに暗示されるので、この場合は必要ありません。引数名が設定している変数名と同じであるセッターでよく使用されます。

public void setName(String name) { 
    this.name = name; 
} 
1

あなたはどんなケースだと思いますか?例えば。 SDK coding style guideには言及されていませんが、私はこれがさまざまな場所で使われているのを見ました。しかし、変数の命名ガイドラインに従うことで、しばしば必要ではなく、省略することができます。これはよくあるケースです。

このキーワードを使用しているインスタンスを参照すると分かりやすくなりますが、ドキュメントには実際に施行されているスタイルはなく、命名規則に従うことで不要になります。

で、これは最初の例では、あなたはできるが、これを使用するために持っていけないということ

private int mCounter; 
    public void setCounter(int counter) { 
     mCounter = counter 
    } 

private int increment; 
public void setIncrement(int increment) { 
    this.increment = increment 
} 

注意することができずに命名以下全く有効セッター。 2番目のスタイルでは、最初はスタイルガイドに近いでしょう。

+0

私が見たサンプルコードとドキュメントのほとんどがそれを利用していないので、彼らは 'this'を気に入らないと思いました。私が読めるようにするためには、ドキュメントを少し難しくしました。なぜなら、メソッドには 'startService()'と言いますが、 'startService()'を含むクラスは分かりません。メソッド呼出しの場合は – cesar

+0

と異なります。修飾子がない場合、this.something()が自動的にJavaで一般的に使用されることはめったにありません。私はそれを使用しません。 –

+0

* "私はちょうど..." - コンセンサスはあなたが間違っていると仮定したことです。 –

0

thisを使用すると、安全対策の詳細です:

class MyClass{ 
    void doSomething() { 
    } 

    OnClickListener n = new OnClickListener() { 
     void doSomething() { 
     } 

     public void onClick(View v){ 
      MyClass.this.doSomething(); // MyClass#doSomething() 
      this.doSomething(); // OnClickListener#doSomething() 

      doSomething(); // OnClickListener#doSomething() if present, 
          // MyClass#doSomething() otherwise - danger! 
     } 
    }; 
} 

OnClickListenerは、サードパーティのクラスであるときなど)、メンバーの存在や方法を制御できない場合がありますので、へ予測可能な行動を取るなら、あなたは常にそのような参照を修飾すべきです。変数の振る舞いがまさにあなたが望むものでない限り。

関連する問題