2017-06-15 10 views
-1

processStateChange()メソッドが呼び出されたとき、コンパイラはどのオブジェクトを渡すべきかをどのように知っていますか?コールバックメソッドのオブジェクト参照

public void onUpdate(Set<Object> objects) 
{ 
    for(Object object : objects) 
    { 
     object.addUpdateListener(new UpdateListener() 
     { 
      @Override 
      public void onUpdate() 
      { 
       processStateChange(object); 
      } 
     }); 
    } 
} 

ループがfor(最終オブジェクトオブジェクト:オブジェクト)の場合、応答に違いはありますか?何が起こっているかを理解するための

+1

オブジェクトへの参照を保持しているobject'ループ内では変更されないので、実質的に最終的なので、 'final'キーワードを省略することができます –

+0

変数はfinalまたは* effectiveley final *でなければなりません。それはスコープです –

答えて

1

が、ここではJavaコンパイラは、コードを見てどのようである:

public void onUpdate(Set<Object> objects) { 
    for(Object object : objects) { 
     object.addUpdateListener(new MyUpdateListener(object)); 
    } 
} 

class MyUpdateListener implements UpdateListener { 
    final Object myObj; // I'm intentionally using different name here 
    MyUpdateListener(Object myObj) { 
     this.myObj = myObj; 
    } 
    @Override 
    public void onUpdate() { 
     processStateChange(this.myObj); 
    } 
} 

ので、UpdateListenerの複数のインスタンスが作成され、それぞれが `それ自身のobject

+0

ありがとう@llyaこれは私が探しているものです。 – Abhijeet

関連する問題