2017-05-20 5 views
0

thisの記事では、以下の例では、 "this"の参照が暗黙的にエスケープされていることが示唆されています。コンストラクタから "this"の参照を公開する

ここで、非静的な内部クラスのインスタンスは、外部クラスのインスタンスを使用して構築できます。これは、次の例では、EventListener2のコンストラクタで新しいインスタンスEventListenerが作成され、 "this"がどのようにエスケープされるか暗黙のうちに。内部クラスが外部クラスへの暗黙の参照を保持していることを知っていますが、記事 "this"が暗黙的にエスケープされ、 "this"がどのようにエスケープされているか理解できない場合、不完全に構築されたEventListenerはエスケープされます「これ」のために同意することができません。

public class EventListener2 { 
    public EventListener2(EventSource eventSource) { 

    eventSource.registerListener(
     new EventListener() { 
     public void onEvent(Event e) { 
      eventReceived(e); 
     } 
     }); 
    } 

    public void eventReceived(Event e) { 
    } 
} 

答えて

1

あなたはごく近いです。静的でない内部クラスを、そのクラスを参照することなくインスタンス化することはできません。非静的な内部クラスのインスタンスは、実際にに、包含するクラスの関連インスタンスへの参照を含みます。そこでここでは、匿名のEventListenerには、囲むインスタンスへの参照がEventListener2という名前が含まれています。

なぜこれが問題であるかを理解するには、EventListener2にはeventReceived(...)が必要とするいくつかのフィールドがある(考えられる)シナリオを考えます。 registerListener(...)に電話すると、他のフィールドが初期化されていないとします。受信機を登録することにより、EventListener2が完全に初期化される前にeventReceived(...)を呼び出すことが可能になります。

関連する問題