this.method()
とmethod()
の呼び出しに違いはありますか(パフォーマンスの違いを含む)?
重要なのは、OuterClass.this.method()
を使用している場合のみです。
class OuterClass {
void method() { }
class InnerClass {
void method() {
OuterClass.this.method(); // not the same as method().
}
}
}
これらのコンストラクト間に違いはまったくなく、生成されたバイトコードはまったく同じになるため、パフォーマンスへの影響はありません。 this
は、明示的に定義されていない場合、コンパイル中に解決されます。
明示的なthis
を使用する唯一の理由は読みやすさです-this
が現在のオブジェクトのインスタンスメソッドであることを示唆しているため、読みやすいと感じる人もいます。
また、method()
が静的な場合、this
の使用は推奨されず、誤解を招く可能性があることに注意してください。
private static void method() {
}
private void foo() {
this.method(); //generates warning in my IDE for a reason
}
この場合、パフォーマンスにも影響しません。
コマンドラインで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
}
メソッドの場合、違いはありませんが、フィールドで違いが生じる可能性があります。次のコードを検討してください。
private String someObject = "some value";
public String someMethod(String someObject) {
//this.someObject refers to the field while
//someObject refers to the parameter
}
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
_を内部クラス/リスナー/スレッド/などで使用します。どのクラスでどのメソッドを呼び出すのか、および/またはどこでクラスインスタンスへの参照が必要なのかを明確にする必要があります。
読みやすさ以外に違いはありません。これにより、読みやすくなります。
実質的な違いはありません-少なくともパフォーマンスへの影響はありません。私は「これ」を書くことを好まない-IDEは通常これへの呼び出しを強調することができ、メソッド/フィールド/ ...へのすべてのアクセスが「this。 「しかし、それは本当に個人的な好みの問題です。
This.method()を使用すると、静的関数や別のオブジェクトに属する関数ではなく、クラスのインスタンスに関連付けられた関数が呼び出されていることが明確になります。
クラス内のすべてのメンバー変数に「m_」を付加するのが好きなC++開発者の精神です。所有権が明確になります。私はそれを好む傾向がありますが、色とフォントを使用してそのようなことを明確にするIDEを使用しているときはそれほど重要ではありません。