18

Javaのメソッドで「this」を使用するのはどうですか? それはオプションですか、それとも義務的に使用する必要がある状況がありますか?

私が遭遇した唯一の状況は、クラス内でメソッド内でメソッドを呼び出すときです。ただし、オプションです。これは、私が何を意味するかを示すためのばかげた例です。

public class Test {

    String s;

    private String hey() {
        return s;
    }

    public String getS(){
        String sm = this.hey();
        // here I could just write hey(); without this
        return sm;
    }
}
4

7 に答える 7

36

あなたがそれを必要とする3つの明白な状況:

  • コンストラクターの最初の部分と同じクラスで別のコンストラクターを呼び出す
  • ローカル変数とインスタンス変数の区別 (コンストラクターまたはその他のメソッドのいずれか)
  • 現在のオブジェクトへの参照を別のメソッドに渡す

3 つすべての例を次に示します。

public class Test
{
    int x;

    public Test(int x)
    {
        this.x = x;
    }

    public Test()
    {
        this(10);
    }

    public void foo()
    {
        Helper.doSomethingWith(this);
    }

    public void setX(int x)
    {
        this.x = x;
    }
}

必要な内部クラスを使用する奇妙な状況もいくつかあると思いますがsuper.this.x、それらは非常にあいまいなので避けるべきです、IMO :)

this.foo()編集:単純なメソッド呼び出しに必要な理由の例は思いつきません。

編集: saua は、あいまいな内部クラスの例の問題についてこれに貢献しました:

あいまいなケースは、メソッドを持つ内部クラスのコードから外部クラスOuterClass.this.foo()にアクセスする場合だと思います。foo()foo()

于 2009-02-05T16:55:34.910 に答える
3

ほとんどの一般的なプログラミングでは、thisキーワードはオプションであり、混乱を避けるために一般的に使用されます。ただし、それが必要な場所がいくつかあります。

class Foo {
    int val;

    public Foo(int val) {
         this(val, 0);  //this MUST be here to refer to another constructor
    }

    public Foo(int val, int another) {
        val = val;       //this will work, but it generally not recommended.
        this.val = val;  //both are the same, but this is more useful.
        method1();       //in a Foo instance, it will refer to this.method1()
        this.method1();  //but in a Foo2 instance, you must use this to do the same
    }

    public void method1() {}
}

class Foo2 extends Foo {
    public Foo2(int val) {
        this(val);        //this will refer to the other Foo2 constructor
    }
    public Foo2(int val, int another) {
        super(val, another);
        super.method1();   //this will refer to Foo.method1()
    }

    @Override
    public void method1() {}//overridden method
}

これらはすべての場合ではありませんが、より一般的なもののいくつかです。thisこれにより、キーワードとキーワード、およびそれらの使用方法と使用時期をよりよく理解できるようになることを願っていsuperます。

于 2009-02-05T17:04:20.463 に答える
3

私はコードを明確にするために "this" を使用します。多くの場合、クラス レベルのメソッドやフィールドにアクセスするのではなく、インスタンス メソッドを呼び出していることを示すヒントとして使用します。

しかし、いいえ。スコープの名前付けの衝突による曖昧さの解消が必要でない限り、実際には「this」は必要ありません。

于 2009-02-05T16:54:21.060 に答える
0

実際に必要になるのは、メンバー変数と同じ名前のメソッドへのパラメーターがある場合だけです。個人的には、変数/メソッドのスコープを明示するために常に使用するようにしています。たとえば、静的メソッドまたはインスタンス メソッドを使用できます。コードを読むとき、どれがどれであるかを知るのに役立ちます。

于 2009-02-05T16:54:56.050 に答える
0

メソッド呼び出しの前に追加する唯一の理由thisは、非静的メソッドを呼び出していることを示すためです。これを行う正当な理由が他に思いつきません (間違っていることを訂正してください)。あまり価値がないので、この規則はお勧めしません。一貫して適用されない場合、誤解を招く可能性があります (this のないメソッド呼び出しが非静的メソッドである可能性があるため)。呼び出されるメソッドが静的かどうかをどのくらいの頻度で気にしますか? さらに、ほとんどの IDE では静的メソッドが異なる方法で強調表示されます。

thisがサブクラスのメソッドを呼び出すことを示し、が存在しない場合はthisスーパークラスのメソッドを呼び出すという規則について聞いたことがあります。しかし、慣習が逆になる可能性があるため、これはばかげています。

編集: mmyers が指摘しているように (コメントを参照)、this静的メソッドで動作します。それで、何の違いもないので、先頭に追加する理由はまったくありthisません。

于 2009-02-11T19:26:49.950 に答える
0

答えではありません(投票してください)が、誰かが尋ねていたコメントにこれを当てはめることができませんでした。

多くの人が「this.x」を使用して、インスタンス変数とローカル変数およびパラメーターを視覚的に区別しています。

したがって、彼らはこれを行うでしょう:

private int sum;
public int storeSquare (int b) {
    int c=b*b;
    this.sum+=c; // Makes sum "pop" I guess
    return c;
}

個人的には、これは悪い習慣だと思います。使用可能なエディターは、インスタンス変数とローカル変数を確実に別の色に設定します。人間が誤りやすいパターンは必要ありません。

「これ」でやる。安全性は 50% しかありません。x がローカル変数の場合に this.x を配置しようとすると、コンパイラはそれを確実にキャッチしますが、インスタンス変数に this. をタグ付けするのを「忘れる」ことを止めるものは何もありません。 1 つだけ (または他の誰かがあなたのコードで作業している場合) で、そのパターンに依存している場合、そのパターンは良いものよりも有害なものになる可能性があります

個人的には、このパターンは、この場合の事実に対するプログラマーの (正当な) 不快感から生じていると確信しています。

public void setMe(int me) {
    this.me=me;
}

「これ」が必要だということ。in before the me はパラメーターの名前によって決まります。これが必要な場合は、一貫性を保ちたいと考えています。私の目の前にあるのに、いつも使わないのはなぜですか?

違和感は分かるが、こう打ち込む。インスタンス変数が使用されるすべての場所は、陳腐で、無意味で、醜く、信頼性がありません。それが本当に気になり、それを解決するために絶対にパターンを使用する必要がある場合は、パラメーターの前に「p」を付ける習慣を試してください。副作用として、パラメーターのケースがメソッドのケースと一致するようになるため、より一定にする必要があります..

public void setMe( int pMe) 
于 2009-02-05T18:47:12.580 に答える