background image

i=mCount)。这是 C++中一个好的习惯,因为编译器会内联这些访问,如果需要约束或

者调试这些域的访问,你可以在任何时间添加代码。

Android 中,这是个不好的想法。虚方法调用代价比直接存取字段高昂的多。按照通

常面向对象语言的做法在公共接口中使用

Getters 和 Setters 是有原因的,但应该在一个经常

访问其字段的类中采用直接访问。

JIT 时,直接字段访问大约比调用无关紧要的 getter 来访问快 3 倍。有 JIT 时(直接访

问字段开销和访问局部变量是一样的),要快

7 倍。在 Froyo 版本中确实如此,但以后会在

JIT 中改进 Getter 方法的内联。

7.对常量使用 Static Final 修饰符

考虑下面类首的声明:

Java 代码

1

static int intVal = 42;    static String strVal = "Hello, world!";    

编译器生成一个类初始化方法

<clinit>,当类初次被使用时执行,这个方法将 42 存入

intVal 中,并得到类字符串常量 strVal 的引用。当这些值在后面被引用时,他们通过字段查
找进行访问。

我们改进实现,采用

 final 关键字:

Java 代码 

2

static final int intVal = 42;    static final String strVal = "Hello, world!";   

类不再需要

<clinit>方法,因为常量进入了 dex 文件中的静态字段初始化器中。引用

intVal 的代码,直接调用整形值 42,而访问 strVal 时也会采用相对开销较小的 “string 
constant”(字符串常量)指令替代字段查找。(这种优化仅仅是针对基本数据类型和 String 类
型常量的,而非任意的引用类型。但尽可能的将常量声明为

static final 类型是一种好的做法。

8.使用改进的 For 循环语法

改进的

for 循环(有时被称为“for-each”循环)能够用于实现了 iterable 接口的集合类及

数组中。在集合类中,迭代器促使接口访问

hasNext()和 next()方法,在 ArrayList 中,计数循

环迭代要快

3 倍(无论有没有 JIT),但其他集合类中,改进的 for 循环语法和迭代器具有

相同的效率。

这里有一些迭代数组的实现:

Java 代码