我们是否应该通过Android平台上的接口引用对象

问题描述:

我使用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的建议?

从Android 2.2开始,Dalvik VM(运行Dalvik字节码是Java源代码的结果)具有即时编译器(JIT)。

我不知道这个特定的优化是否是JIT的一部分,但它应该在实际设备上测试。

如果您在前目标2.2设备在调用者6%的开销(这是不与您的应用程序的全部测试6%放缓混淆!)对您的应用程序产生严重的影响,那么优化可能是值得的。

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

这是首选,超越性能的原因。这是一个私有变量,使用已知最具体的类型。

+0

原因不具体。它与私有变量无关。 Joshua Bloch提供的例子也是私人的。 –

+0

所以Joshua Bloch是错的。 – irreputable

+2

我认为你对此非常傲慢。你至少需要提供一些真实世界的例子和事实来支持你的陈述。至少在Joshua Bloch的Effective Java中,他提供了一个非常好的现实世界的例子,为什么使用接口更好。 –