2010-09-15 343 views
4

在我的Android項目中,我定義了幾個回調來操作按鈕點擊,連接事件或UI事件,如Dilaog.onShow()。爲了演示目的,我選擇了一個Runnable接口,它必須從某些Activity代碼啓動。用Java,我有不同的表達方式。什麼是組織回調的首選方法?

一種模式是使用匿名類

runOnUiThread(new Runnable() { 
    public void run() { 
     doSomething(); 
    } 
}); 

private void doSomething() { 
} 

另一個 - 定義一個內部的私有類,即

private DoSomething implements Runnable { 
    public void run() { 
     // do something; 
    } 
} 
... 
runOnUiThread(new DoSomething()); 

另一個 - 使用私有成員,像這樣:

private final Runnable doSomething = new Runnable() { 
    public void run() { 
     // do something; 
    } 
} 
... 
runOnUiThread(doSomething); 

這是另一個,我最喜歡的,因爲一方面它並不實際構造o除非有人真的使用它,因爲它避免了額外的類,因爲如果需要它可以採用參數。

private Runnable doSomething() { 
    return new Runnable() { 
     public void run() { 
      // do something; 
     } 
    } 
} 
... 
runOnUiThread(doSomething()); 

我不是在尋找品味或宗教信仰的觀點,而是代碼可維護性和性能。我希望收到一些提示和建議,這些提示和建議可以幫助我發展自己的偏好,可能會根據特定的情況制定不同的偏好。

劇透:

Java的進展已使這個問題已經過時,見接受的答案。

+1

相關:[這是\ [代碼質量]的結尾嗎?](http://meta.stackoverflow.com/q/313767/4639281)。如果您可以編輯這個問題,以不基於意見的方式對其進行標記,並刪除[tag:code-quality]標籤,那麼我將收回我的近距離投票(如果它再次關閉,則投票重新打開)。 – 2016-01-07 01:38:44

+0

對不起,我不知道這個有問題的標籤。 – 2016-01-07 04:51:55

+0

你的問題仍然有過分基於意見的措辭。我相信它可以被編輯爲不是這樣,但這取決於你。 – 2016-01-07 04:53:31

回答

0

今天,當Java的8幾乎可用於Android,而Android工作室automagically假裝lambda表達式已經被支持,匿名類(#1)解決方案似乎是顯而易見的選擇:

collapsed

expanded

0

從我的角度來看,匿名類真的會降低可讀性。由於Ui代碼通常非常冗長,爲每個按鈕添加匿名回調可能會導致非常大的類。因此我正在使用內部私人課程。

+0

謝謝,我已經修復了第一個例子來更好地表達這個想法:在我的例子中匿名回調只是調用一個私有方法,不太可能是兩個。 – 2010-09-16 09:38:29

1

我很新到Android,但匿名類讓我想吐,似乎你已經替代反正runOnUiThread:的AsyncTask,這裏討論: runOnUIThread question

+0

感謝您的指針 – 2012-01-09 02:46:41

2

我不相信有任何地道處理回調的方式。

我通常首先內聯一個匿名類。當方法變得太大時,我將類創建提取到一個單獨的函數中。當班級變得太大時,我會提取自己的文件。

如果您使用Eclipse之類的IDE,則可以自動安全地執行所有這些重構。

2

就像@Manuel Silva和@Toby Champion一樣,我不喜歡匿名的內部類。它們有點難以閱讀,不是很「OO」,因爲它們不能被擴展,不能有DIP,setter或任何調整行爲等等,並且它們通常最終違反DRY原則當你在27個不同的地方添加相同的代碼時。

我傾向於使用私有成員(您的選項#3)或通常名爲getAsRunnable()的私有函數(您的第4種樣式)。

相關問題