2013-03-21 141 views
0

我重構一類面向公衆的接口,並考慮使用飛帶領我問:匿名內部類:聲明爲實例變量VS創建於

是什麼聲明中的一些下面的區別較大的類(作爲一個實例變量):

private final OnClickListener mButtonOnClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View view) {    
     //some codes 
    } 
}; 

VS聲明爲如下(飛)匿名內部類:

private void someFunctionInClass() { 
    someOtherFunctionThatTakesAnOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) {    
      //some codes 
     } 
    }); 
} 

更多SP特別是,前者依然被認爲是一個匿名的內部類?我在this answer讀到一個匿名內部類

是生成與另一個類的方法的正文中所定義的一個

我給被創建和另一個在主體內限定的第一個例子第二個是類,但不在另一個類的方法中。它仍然是一個匿名的內部類嗎?此外,一個人與另一個人接受的做法是什麼?將一個匿名內部類作爲一個實例變量聲明(我認爲還是這樣)是否更高效,因爲不需要重新創建新對象?

+0

匿名類是一個匿名類。在這兩種情況下,仍然只有*一個* [匿名]類型 - 結果實例的使用與類型本身無關。 – 2013-03-21 20:12:22

回答

1

這些都是匿名類。在第一個中,您可以重用它,但兩者都只是創建的對象。匿名類必然是內部類,並且可以訪問封閉類的任何字段。

我想你可能會得到與inner classes and static nested classes混淆的匿名類,它們有明顯的區別。

0

兩者都是匿名類。以一個監聽器爲例,如果您打算對兩個組件使用相同的監聽器,那麼您可以擁有一個實例變量,否則可以直接將其附加到該組件。所以這取決於要求。

但主要是它的一次性使用,即避免爲此創建實例。如果你打算重用它,那麼最好爲此創建一個單獨的類。

0

兩者都是匿名類。一個匿名類是一個構造函數(new ClassName()),後面跟着一個類體({...})。

0

在你的例子中,在這兩種情況下你都創建了匿名內部類。它「新的OnClickListener(){」我認爲它沒有開銷,因爲它在編譯時得到解決。人們一直都在使用它。