6. 在私有内部类,优先考虑包访问权限,而不是私有访问权限
如下的类:
public class Foo { private class Inner { void stuff() { Foo.this.doStuff(Foo.this.mValue); } } private int mValue; public void run() { Inner in = new Inner(); mValue = 27; in.stuff(); } private void doStuff(int value) { System.out.println("Value is " + value); } }这里我们定义了一个私有内部类,它直接访问了了外部类的一个私有方法和一个私有实例域。
问题是,虚拟机认为从Foo$Inner直接访问Foo的私有成员是非法的,因为Foo和Foo$Inner是两个不同的类,尽管Java语言语序内部类访问外部类的私有成员。为了缩小这个差距,编译器生成了一系列的合成方法:
/*package*/ static int Foo.access$100(Foo foo) { return foo.mValue; } /*package*/ static void Foo.access$200(Foo foo, int value) { foo.doStuff(value); }内部类将会访问这些static方法,当它尝试访问外部类的mValue成员或者doStuff方法。上边的代码可以归结为,从哪里使用存取器方法访问域。上一篇我们提到了使用存取器方法比直接访问要慢,所以这里既有一个造成不可见的性能影响的实例。
在性能敏感的场合,通过在内部类定义域和方法的访问权限为包访问,可以避免上述性能问题。不过问题是,这些域就可以被同包的其它类访问了,所以在共有的API中,不能这么做。
7. 避免使用浮点数
根据经验,在android设备上,浮点数要比int慢2倍以上。
在速度方面,float和double在现代的硬件上几乎没有差别。从空间来讲,double是float的2倍。在台式设备上,空间不是个大问题,可以优先使用double。
即便对于整形,一些设备上有乘法加速,但是却没有除法加速,整数除法和求余是用软件实现的。当设计一个哈希表,或者进行大量数学运算时,要考虑这点。
8. 了解并使用库
系统库都经过大量的验证,性能和稳定性往往比你自己手写的代码要好很多。比如,一个系统的arrayCopy()方法,大概要比手写的loop快9倍……
9. 小心使用native方法
通过Android NDK使用native语言开发app并不比使用Java语言更高效。这是个误区。首先,在java和native语言之间的转换是需要开销的,JIT不能针对这个边界进行优化。如果分配了native的资源,很难安排时间对它们进行回收。而且native语言还需要针对不同的平台进行编译。
如果你已经有了一个native的代码库,并且想将它移植到anroid,那么native编码是很有用的;但native编程并不能帮你优化JAVA开发的app。