我习惯于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的建议吗?
答案 0 :(得分:2)
从Android 2.2开始,Dalvik VM(运行由Java源代码生成的Dalvik字节码)具有即时编译器(JIT)。
我不知道这个特定的优化是否是JIT的一部分,但它应该可以在实际设备上测试。
如果你定位2.2之前的设备和这些6%的调用开销(不要与你的应用程序的6%减速混淆!)对您的应用程序产生严重影响,那么优化可能是值得的。
答案 1 :(得分:-3)
private ArrayList<Integer> mPhotos = new ArrayList<Integer>();
除性能原因外,这是首选。它是一个私有变量,使用已知的最具体类型。