赞
踩
在常规的 Android 项目中,资源 R 类中的常量声明如下:
public static final int main =0x7f030004;
但是,从 ADT 14 开始,在库 项目中,它们将像这样声明:
public static int main =0x7f030004;
换句话说,常量 在库项目中不是最终的。原因很简单:当多个库项目组合在一起时,字段的实际值(必须是唯一的)可能会发生冲突。在 ADT 14 之前,所有字段都是最终的,因此,无论何时使用,所有库都必须将其所有资源和关联的 Java 代码与主项目一起重新编译。这对性能不利,因为它使构建速度非常慢。它还阻止分发不包含源代码的库项目,限制了库项目的使用范围。
字段不再是 final 的原因是这意味着库 jar 可以编译一次并直接在其他项目中重用。除了允许分发库项目的二进制版本(在 r15 中),这使得构建速度更快。
但是,它对库的源代码有一个影响。以下形式的代码将不再编译:
int id = view.getId();
switch (id) {
案例 R.id.button1:
action1();
break;
case R.id.button2:
action2();
break;
case R.id.button3:
action3();
break;
}
这是因为该switch语句要求所有 case 标签(例如 )R.id.button1在编译时保持不变(这样可以将值直接复制 到 .class 文件中)。
解决方案很简单:将 switch 语句转换为 if-else 语句。
在上面的场景中,它会将switch语句变成这样:
int id = view.getId();
如果(id == R.id.button1){
动作1();
} else if (id == R.id.button2) {
动作2();
} else if (id == R.id.button3) {
动作3();
}
这通常在 UI 代码中,对性能的影响可以忽略不计。
PS 如果您的 switch 语句如下所示:
switch (view.getId()) {
那么你最终会得到一个效率低下的if/else链,其中每个if检查都重复 view.getId() 调用。只需先提取这个表达式(使用“提取局部变量”重构击键),然后转换 switch 语句。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。