私はちょうどthis
の使用について興味があります.Androidのサンプルコードとドキュメントではthis
キーワードを使用していないためです(アンドロイドエンジニアは一般的にスマートなので、 )。私は、アンドロイドのエンジニアがthis
をあまり使わない根本的な理由を知りたいだけです。Javaで `this`を使うのは悪い習慣ですか?
答えて
主に文体の違いです。私はまだそれが良いか悪いかという議論を見てきました。個人的に私はそれを使用したいと思うし、あなたがそれを使用する必要があるときにはいくつかの例があります。
たとえば、親クラスのメソッドを呼び出す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
を使用する必要がありますおそらくより多くの場所があります。これらは、頭に浮かぶ最初の数です。
これは、現在のインスタンスの一部にアクセスして、ローカルスコープ内の何かに隠れている場合にのみ必要です。 OnClickListenerには、MyClass#doSomething()を隠すdoSomething()がないため、内部クラスでは必要ありません。 – jackrabbit
これは問題ではありませんが、コードで 'this'を使用する場合は、どこでも使用してください。それはあなたのコードを明確にします。
これは悪い習慣よりも個人的な味です。
いいえ、アンドロイドのサンプルコードには「this」への参照がありますが、これを悪い習慣と考える理由はありません。しかし、多くの時間は不必要であり、簡潔さのために省略されている可能性があります。
たとえば、定義されているクラス内からmethodA()を呼び出すと、this.methodA()として呼び出すことができます。これは、あなたが電話をかけるときに暗示されるので、この場合は必要ありません。引数名が設定している変数名と同じであるセッターでよく使用されます。
public void setName(String name) {
this.name = name;
}
あなたはどんなケースだと思いますか?例えば。 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番目のスタイルでは、最初はスタイルガイドに近いでしょう。
私が見たサンプルコードとドキュメントのほとんどがそれを利用していないので、彼らは 'this'を気に入らないと思いました。私が読めるようにするためには、ドキュメントを少し難しくしました。なぜなら、メソッドには 'startService()'と言いますが、 'startService()'を含むクラスは分かりません。メソッド呼出しの場合は – cesar
と異なります。修飾子がない場合、this.something()が自動的にJavaで一般的に使用されることはめったにありません。私はそれを使用しません。 –
* "私はちょうど..." - コンセンサスはあなたが間違っていると仮定したことです。 –
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
は、サードパーティのクラスであるときなど)、メンバーの存在や方法を制御できない場合がありますので、へ予測可能な行動を取るなら、あなたは常にそのような参照を修飾すべきです。変数の振る舞いがまさにあなたが望むものでない限り。
- 1. これは悪い習慣ですか?
- 2. は@unlink悪い習慣ですか?
- 3. Java Swing ElementsでHTMLスタイルを使用するのは悪い習慣ですか?
- 4. ステートフルヘルパークラスを使用するのは悪い習慣ですか?
- 5. Javaではどのようなグローバル変数が悪い習慣ですか?
- 6. インタフェースとしてのラベルはJava OOでは悪い習慣ですか?
- 7. 一般ヘルパー関数に$ .extendを使うのは悪い習慣ですか?
- 8. memcpyをstrncpyなどに使うのは悪い習慣ですか?
- 9. Java標準キーストアを使用することは悪い習慣です
- 10. golangのエラーをリセットするのは悪い習慣ですか?
- 11. 静的クラスはPHPでは悪い習慣ですか?
- 12. Java - クラスコンストラクタを持たないことは悪い習慣ですか?
- 13. スイッチケースにスイッチケースを入れるのは悪い習慣ですか?
- 14. 静的なフィールドを持つのは悪い習慣ですか?
- 15. BackPressedを呼び出すことは悪い習慣ですか?
- 16. HTMLでインラインイベントハンドラを使用するのは悪い習慣ですか?
- 17. jQuery関数内でJavascriptを使用するのは悪い習慣ですか?
- 18. typedefの短縮形ヘッダファイルは悪い習慣ですか?
- 19. データ転送オブジェクトの継承は悪い習慣ですか?
- 20. メソッドの静的なローカル変数は悪い習慣ですか?
- 21. オブジェクト間の循環参照は悪い習慣ですか?
- 22. ドメインオブジェクトの永続アノテーションは悪い習慣ですか?
- 23. Objective-Cのサブクラス化は悪い習慣ですか?
- 24. 火災ベースの静的データは悪い習慣ですか?
- 25. 「例外をスローする」というのは悪い習慣ですか?
- 26. リポジトリパターン内のIDでフィルタするのは悪い習慣です
- 27. コンストラクタでセッターメソッドを使用する:悪い習慣?
- 28. 拡張メソッドと拡張プロパティは悪い習慣ですか?
- 29. 再帰は一般的に悪い習慣ですか?
- 30. JavascriptなぜFOR INは悪い習慣ですか?
あなたは* this *なしでは暮らすことができない例を教えてください。 – Gleno
を使って 'this'はアンドロイドについて確信していない良い練習です。キーバリューコーディングに何かがあるかもしれません。 – Shahzeb
私はそれなしで暮らすことができると思いますが、個人的に、私はこれを使いやすくしています。それは私にとって明白なので、より明確にします。 – cesar