12

重複の可能性:
クラスでいつ「this」を使用する必要がありますか?

インスタンスのフィールドを参照するときに「this」を使用するかどうかをどのように判断しますか?

例えば:

return this.name

私はそれが役立つ1つのケースを教えられました。つまり、入力パラメーターがフィールドの名前と同じ場合:

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

それ以外では、「これ」は不要のようです.. 他にどんな場合がありますか?

4

7 に答える 7

6

class のコンストラクターが多すぎる場合は、これを使用して他のコンストラクターを呼び出すことができます。例 :

public class TeleScopePattern {

    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;

    public TeleScopePattern(int servingSize, int servings) {
        this(servingSize, servings, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories, int fat) {

        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;

    }

}
于 2012-08-16T15:13:18.463 に答える
5

いくつかのケースでこれを使用する必要があります:

  1. フィールドとメソッドパラメータ/ローカル変数の名前が同じで、フィールドを読み書きしたい場合

  2. 内部クラスから外部クラスのフィールドにアクセスしたい場合:

    class Outer {
    
        private String foo;
    
        class Inner {
            public void bar() {
                 System.out.println(Outer.this.foo);
            }
        }
    }
    
  3. あるコンストラクターを別のコンストラクターから呼び出したい場合 (ただし、メソッド呼び出しのようなものです -this(arg1, arg2);

他のすべての使用法は、スタイルの問題です。

于 2012-08-16T15:17:47.430 に答える
2

Fluent Interface パターンは基本的に、「セッター」メソッドから戻ることを意味しthis、メソッド呼び出しを「連鎖」できるようにします。

StringBuilder流暢なインターフェースを持つJDKの一例です。仕組みは次のとおりです。

int count = 5;
StringBuilder sb = new StringBuilder();
String result = sb.append("The total is ").append(count).append(".").toString(); 

上記の最後の行は次と同等です。

sb.append("The total is ");
sb.append(count);
sb.append(".");
String result = sb.toString();

しかし、その結果、コードが少なくなり、おそらくより読みやすくなります。

さまざまなメソッドの実装はappend()すべて を返しthisます。

于 2012-08-16T15:51:05.497 に答える
2

その場合 (非常に一般的ですが、変数とパラメーターを区別しやすくするために、変数とパラメーターに別の名前を付けることを好むのは難しいです) とは別に、それをコンストラクターとして使用する場合とは別に、別のケースがあります。

インスタンス化されたオブジェクトをメソッドに渡したい場合があります。その場合、これをそのインスタンスのクラスを受け取るメソッドのパラメーターとして使用します。たとえば、インクリメントを行う補助クラスを持つメソッドがあるとします。

public class MyClass {

    private Integer value = 0; //Assume this has setters and getters

    public void incrementValue() {
        Incrementer.addOne(this);
    }

}

また、インクリメンタ クラスには次のようなメソッドがあります。

public static void addOne(MyClass classToIncrement) {
    Integer currentValue = classToIncrement.getValue();
    currentValue++;
    classToIncrement.setValue(currentValue);
}

詳細については、ドキュメントを確認してください。

于 2012-08-16T15:16:16.213 に答える
1

ほとんどの場合、クラス内からメソッドまたは属性を参照する場合、これは不要です。ただし、変数が関数スコープではなくクラススコープに格納されていることを明確にすることで、読みやすさが向上します。

于 2012-08-16T15:16:57.337 に答える
0

「インスタンスメソッドまたはコンストラクター内でthisは、現在のオブジェクトへの参照です。メソッドまたはコンストラクターが呼び出されているオブジェクトです。インスタンスメソッドまたはコンストラクター内から、を使用して現在のオブジェクトの任意のメンバーを参照できますthis。」

詳細といくつかの例については、こちらをお読みください。

于 2012-08-16T15:16:15.370 に答える
0

誰がそのように教えたのかはわかりませんが、私の知る限り、これは現在のオブジェクトへの参照です。

returnType method(dataType val){
dataType myVariable = someOperation(this.val);
return myVariable;
}

docs.oracle.comに詳細が記載されています。

于 2012-08-16T15:33:40.890 に答える