然而,在Android上,这是一个糟糕的写法。虚函数的调用比起直接访问变量要耗费更多。在面向对象编程中,将getter和setting暴露给公用接口是合理的,但在类内部应该仅仅使用域直接访问。
在没有JIT(Just In Time Compiler)时,直接访问变量的速度是调用getter的3倍。有JIT时,直接访问变量的速度是通过getter访问的7倍。
请注意,如果你使用ProGuard, 你可以获得同样的效果,因为ProGuard可以为你inline accessors.
使用增强的For循环增强的For循环(也被称为 for-each 循环)可以被用在实现了 Iterable 接口的 collections 以及数组上。使用collection的时候,Iterator (迭代器,译者注) 会被分配,用于for-each调用hasNext()和next()方法。使用ArrayList时,手写的计数式for循环会快3倍(不管有没有JIT),但是对于其他collection,增强的for-each循环写法会和迭代器写法的效率一样。
请比较下面三种循环的方法:
staticclassFoo{
int mSplat;
}
Foo[] mArray =...
publicvoid zero(){
int sum =0;
for(int i =0; i < mArray.length;++i){
sum += mArray[i].mSplat;
}
}
publicvoid one(){
int sum =0;
Foo[] localArray = mArray;
int len = localArray.length;
for(int i =0; i < len;++i){
sum += localArray[i].mSplat;
}
}
publicvoid two(){
int sum =0;
for(Foo a : mArray){
sum += a.mSplat;
}
}
zero()是最慢的,因为JIT没有办法对它进行优化。
one()稍微快些。
two() 在没有做JIT时是最快的,可是如果经过JIT之后,与方法one()是差不多一样快的。它使用了增强的循环方法for-each。
所以请尽量使用for-each的方法,但是对于ArrayList,请使用方法one()。
你还可以参考 Josh Bloch 的 《Effective Java》这本书的第46条
使用包级访问而不是内部类的私有访问参考下面一段代码
publicclassFoo{
privateclassInner{
void stuff(){
Foo.this.doStuff(Foo.this.mValue);
}
}
privateint mValue;
publicvoid run(){
Innerin=newInner();
mValue =27;
in.stuff();
}
privatevoid doStuff(int value){
System.out.println("Value is "+ value);
}
}