web-dev-qa-db-ja.com

Javaでは、this.method()とmethod()の違いは何ですか?

this.method()method()の呼び出しに違いはありますか(パフォーマンスの違いを含む)?

45
nebkat

重要なのは、OuterClass.this.method()を使用している場合のみです。

class OuterClass {
    void method() { }

    class InnerClass {
        void method() {
            OuterClass.this.method(); // not the same as method().
        }
    }
 }
59
Peter Lawrey

これらのコンストラクト間に違いはまったくなく、生成されたバイトコードはまったく同じになるため、パフォーマンスへの影響はありません。 thisは、明示的に定義されていない場合、コンパイル中に解決されます。

明示的なthisを使用する唯一の理由は読みやすさです-thisが現在のオブジェクトのインスタンスメソッドであることを示唆しているため、読みやすいと感じる人もいます。

また、method()が静的な場合、thisの使用は推奨されず、誤解を招く可能性があることに注意してください。

private static void method() {
}

private void foo() {
    this.method();    //generates warning in my IDE for a reason
}

この場合、パフォーマンスにも影響しません。

28

コマンドラインでjavap -c ClassNameを呼び出すと、違いがないことがわかります。例えば:

public class This {
    private void method() {
    }
    public void noThis() {
        method();
    }
    public void useThis() {
        this.method();
    }
}

次の逆アセンブルされた出力を生成します。

Compiled from "This.Java"
public class This extends Java.lang.Object{
public This();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method Java/lang/Object."<init>":()V
   4:   return

public void noThis();
  Code:
   0:   aload_0
   1:   invokespecial   #2; //Method method:()V
   4:   return

public void useThis();
  Code:
   0:   aload_0
   1:   invokespecial   #2; //Method method:()V
   4:   return

}
18
Atreys

メソッドの場合、違いはありませんが、フィールドで違いが生じる可能性があります。次のコードを検討してください。

private String someObject = "some value";

public String someMethod(String someObject) {
     //this.someObject refers to the field while
     //someObject refers to the parameter
}
5
Chris Knight

this.method()および/または_this.myVar_を使用するか、しないでください-メソッドでは違いはありません。コード全体に散らばっているのを見ると、時々_this.m_myClassVar_を見ることさえあります。

個人的には、クラス変数の前に単純なアンダースコアを付け、メソッドの引数に末尾のアンダースコアを付けることを好みます。

_public MyClass
{
    private int _myInt;

    public void myMethod(final int myInt_, final int fooFactor_)
    {
        _myInt = myInt_ * fooFactor_;
    }
}
_

ほとんどのIDEではどちらが明確になりますが、これにより誤割り当てが防止され、コードの意図がより明確になり、IMOが読みやすくなります。

_thisInstance.myMethod()(__thisInstance_は外部クラスへの参照)または__thisInstance._myVar_を内部クラス/リスナー/スレッド/などで使用します。どのクラスでどのメソッドを呼び出すのか、および/またはどこでクラスインスタンスへの参照が必要なのかを明確にする必要があります。

2
Developer Dude

読みやすさ以外に違いはありません。これにより、読みやすくなります。

2
javanerd

実質的な違いはありません-少なくともパフォーマンスへの影響はありません。私は「これ」を書くことを好まない-IDEは通常これへの呼び出しを強調することができ、メソッド/フィールド/ ...へのすべてのアクセスが「this。 「しかし、それは本当に個人的な好みの問題です。

2
David Tanzer

This.method()を使用すると、静的関数や別のオブジェクトに属する関数ではなく、クラスのインスタンスに関連付けられた関数が呼び出されていることが明確になります。

クラス内のすべてのメンバー変数に「m_」を付加するのが好きなC++開発者の精神です。所有権が明確になります。私はそれを好む傾向がありますが、色とフォントを使用してそのようなことを明確にするIDEを使用しているときはそれほど重要ではありません。

1
duffymo