2011-07-07 22 views
6

我使用Joshua Bloch的Effective Java,Item 52: Refer to objects by their interfaces提供的建議。我們是否應該通過Android平臺上的接口引用對象

但是,在大多數Android示例代碼中,我意識到以下代碼是相當常見的。

private ArrayList<Integer> mPhotos = new ArrayList<Integer>(); 

我明白這是由於性能優化的目的,因爲下面的代碼會更慢。

private List<Integer> mPhotos = new ArrayList<Integer>(); 

但是,這樣的優化技術仍然有效嗎?因爲如果我從 http://developer.android.com/guide/practices/design/performance.html

未經JIT讀取在設備上,這是事實,經由與確切類型,而不是一個接口的變量調用方法會更有效。 (因此,例如,調用HashMap地圖上的方法比Map地圖更便宜,即使在這兩種情況下地圖都是HashMap。)情況並非如此,速度慢了2倍;實際差異更慢了6%。此外,JIT使這兩者實際上難以區分。

我們是否需要假設我們的設備沒有JIT,並且引用沒有接口的對象?或者,我們是否應該採用Joshua Bloch的建議?

回答

2

從Android 2.2開始,Dalvik VM(運行Dalvik字節碼是Java源代碼的結果)具有即時編譯器(JIT)。

我不知道這個特定的優化是否是JIT的一部分,但它應該在實際設備上測試。

如果您在前目標2.2設備在調用者6%的開銷(這是不與您的應用程序的全部測試6%放緩混淆!)對您的應用程序產生嚴重的影響,那麼優化可能是值得的。

-3
private ArrayList<Integer> mPhotos = new ArrayList<Integer>(); 

這是首選,超越性能的原因。這是一個私有變量,使用已知最具體的類型。

+0

原因不具體。它與私有變量無關。 Joshua Bloch提供的例子也是私人的。 –

+0

所以Joshua Bloch是錯的。 – irreputable

+2

我認爲你對此非常傲慢。你至少需要提供一些真實世界的例子和事實來支持你的陳述。至少在Joshua Bloch的Effective Java中,他提供了一個非常好的現實世界的例子,爲什麼使用接口更好。 –

相關問題