2011-07-01 19 views

答えて

58

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

class OuterClass { 
    void method() { } 

    class InnerClass { 
     void method() { 
      OuterClass.this.method(); // not the same as method(). 
     } 
    } 
} 
+1

しかし、OuterClass.method()はメソッドがstaticの場合と同じです –

+3

厳密に言えば、IMHOでは、OuterClass.this.method()をmethod()と比較することはできません。イン/アウト。 –

+1

この特別な例Peterをお越しいただきありがとうございます。 –

27

これらの構成要素には全く違いはなく、生成されるバイトコードはまったく同じで、パフォーマンスには影響しません。 thisは、明示的に定義されていないとコンパイル時に解決されます。

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

method()が静的​​な場合は、thisを使用することはお勧めできません。

private static void method() { 
} 

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

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

+1

メソッドが静的な場合は正しくありません。私のコンパイラは静的メソッドのための "this"ポインタがないことを教えてくれます。 – duffymo

+0

@duffymo:私は '静的'メソッドについて何を意味するのかを明確にしました。 –

+0

ありがとう、トマシュ。私からの投票はありません。あなたの明確化は完璧です。 – duffymo

2

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

1

this.method()を使用すると、静的関数または別のオブジェクトに属する関数とは対照的に、クラスのインスタンスに関連付けられた関数が呼び出されます。

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

+0

"*他のオブジェクトに属するもの*"まあ、他のオブジェクトの接頭辞は必須ですか? "*静的関数とは対照的*"この区別は重要ですか? – PhiLho

5

方法には違いはありませんが、フィールドとの違いがあります。何の違いはコマンドライン上でjavap -c ClassNameを呼び出すことによって見ることができますが存在しないこと

private String someObject = "some value"; 

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

:このコードを考えてみましょう。たとえば :

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 

} 
+0

唯一の違いは、コンパイル時に暗黙の 'this 'を見つけ出すには数マイクロ秒です。 – TWiStErRob

2

読みやすさよりも他のすべての違いはありません。それは読者にそれをより明確にします。

+1

読みやすさは目に見えます:「これ」の情報は暗黙的なので重複しているので、より騒々しいと感じます。それは初心者を助けるかもしれない、(多くの)より経験豊富なコーダーのために迷惑である。 – PhiLho

-2

コンストラクタでthis.variableを実行しようとしましたか?

理論上、C++では、オブジェクトがまだ作成されていないので、これはありません。私はJavaの場合についてはわかりません。

+0

'this.foo = foo;'は同じ名前のパラメータからフィールド(メンバ変数)を初期化する非常に一般的なパターンなので、Javaで動作します。 – PhiLho

2

および/またはthis.myVarを使用するか、または違いがない方法を使用しないでください。違いがあるかもしれませんが、一貫性があります。私はそれがコード全体に振りかけるのを見ます、時々私はthis.m_myClassVarを参照してください。

は個人的に私は私のメソッドの引数に私のクラスは、単純なアンダースコアでvarsのプレフィックスと末尾を置くことを好むアンダースコア:

public MyClass 
{ 
    private int _myInt; 

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

ほとんどのIDEは、私はこれを防ぐために傾向が見つけた、であることが明確になりますが、誤った割り当てを行い、コードの意図をより明確にし、IMOを読みやすくします。

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

+0

変数名にアンダースコアを使用すると、定数でない変数のJava命名規則に反します。 –

関連する問題