2017-06-15 110 views
-1

在下面的代碼中,當調用processStateChange()方法時,編譯器如何知道要傳遞哪個對象?回調方法中的對象引用

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

如果循環爲:for(final Object object:object),那麼在響應中是否有任何區別?

+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