2012-10-23 103 views
0

我有一個對象,我想在我調用適當的實例方法時進行修改。 (我認爲這是正確的詞彙)如果創建內部類,如何讓實例方法修改對象?

從一個班,我這樣做:

Pizza pizza = new Pizza(); 
pizza.addTopping(Cheese); 
pizza.addTopping(Pepperoni); 
pizza.setCrustType("thick"); 
pizza.make(); 
pizza.putInOven(); 

這就是事情變得有趣。所以這裏的make()方法在Pizza中被稱爲上面的方法。

public void make() 
{ 
     final Pizza pizza = this; 
     pizza.registerUpdateHandler(new IUpdateHandler() 
     {    
      @Override 
      public void onUpdate(float cookTime) 
      { 
       // need to do some modifications to pizza 
       pizza.doSomething(); 
       pizza.doSomethingElse(); 
      } 
     }); 
} 

爲了能夠訪問內部類內的比薩餅對象,IUpdateHandler(),我要一個Pizza對象設置爲this。但是,它也必須是final因爲你:

Cannot refer to a non-final variable inside an inner class defined in a different method

要回到我原來的代碼片段,我仍然需要調用pizza.putInOven(),並將它是引用相同的Pizza對象爲所有其他呼叫,但make()方法效果修改。因爲我必須在方法make()中創建一個新的Pizza對象final,即不再是相同的對象時,我想調用putInOven()

我該如何解決這個問題?如果我的問題不清楚,我會盡我所能編輯和重申,只留下評論。

回答

1

你不需要額外的比薩變量,因爲代碼已經在比薩餅對象內執行了。

public void make(){ 
     registerUpdateHandler(new IUpdateHandler(){    
      @Override 
      public void onUpdate(float cookTime){ 
       // need to do some modifications to pizza 
       doSomething(); 
       doSomethingElse(); 
      } 
     }); 
} 
+0

哇!我覺得很愚蠢!我試過這個,但是我放了'this.doSomething()',如果它抱怨'doSomething()'方法不是'IUpdateHandler'類型的話。一旦我省略它,一切都好!謝謝!!!! –

3

因爲我必須在方法make()中創建一個final類型的新比薩對象,當我想調用putInOven()時,它不再是相同的對象。

這是不正確的。

final Pizza pizza = this; 

由於您沒有使用new運算符,因此此行不會創建新對象。所以,這是this引用的同一個對象,因此您的putInOven將看到make方法所做的更改。

+0

嗯......不知道我完全同意。我想我沒有創建一個「新」對象,但我絕對創建了一個新的對這個方法範圍本地的pizza對象,不是嗎?因此,在對象的此方法範圍之外不會看到這些更改嗎? –

+0

@ unexpected62不,你剛剛創建了一個指向'this'的引用。 – mzzzzb

+1

只有對象的引用(或指針)是方法的本地對象。但它是由創建的新參考修改的同一個對象。 – Azodious

相關問題