我们应该通过Android平台中的接口来引用对象

时间:2011-07-07 13:23:59

标签: java android

我习惯于Joshua Bloch的Effective Java Item 52: Refer to objects by their interfaces给出的建议。

但是,在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 个答案:

答案 0 :(得分:2)

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

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

如果你定位2.2之前的设备这些6%的调用开销(不要与你的应用程序的6%减速混淆!)对您的应用程序产生严重影响,那么优化可能是值得的。

答案 1 :(得分:-3)

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

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