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

Che*_*eng 6 java android

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

但是,在Android的大多数示例代码中,我意识到以下代码非常常见.

private ArrayList<Integer> mPhotos = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

我理解这是由于性能优化的目的,因为下面的代码会更慢.

private List<Integer> mPhotos = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

但是,这种优化技术仍然有效吗?好像我从http://developer.android.com/guide/practices/design/performance.html上读到

在没有JIT的设备上,通过具有精确类型而不是接口的变量调用方法确实更有效.(例如,调用HashMap映射上的方法比使用Map映射更便宜,即使在这两种情况下映射都是HashMap.)情况并非如此慢2倍; 实际差异更像是慢了6%.此外,JIT使两者有效地难以区分.

我们是否需要假设我们的设备没有JIT,并且引用没有接口的对象?或者,我们应该接受Joshua Bloch的建议吗?

Joa*_*uer 2

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

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

如果您的目标是 2.2 之前的设备,并且调用中的 6% 开销(不要与应用程序总体 6% 的速度下降混淆!)对您的应用程序产生严重影响,那么这种优化可能是值得的。