移植一个项目到框架中,原项目代码中使用:
swich(id)
case R.id.XX:break;
case R.id.XX:break;
代码不报错,但我移植到我的Frame框架中(Frame框架是作为库存在的)报错,提示case键必须使用常量。
开始想不明白,为什么两个项目中会有如此区别呢?后来看了一篇博客,才恍然大悟。
Case 标签中的常量字段——在正常的 Android 项目中,资源R类里的常量是这样声明的:
public static final int main=0x7f030004;
然而,到 ADT 14为止,在类库项目中,他们会被这样声明:
public static int main=0x7f030004;
换句话说,在库项目中这些常量都不是final的。原因很简单:当多个库项目整合时,字段的实际值(必须是唯一的)可能会出现碰撞。在ADT
14 之前,所有这样的字段都是final的,所以导致所有的库被使用的时候,主项目必须编译他们的所有资源和相关 Java
代码。这样的性能是很差的,因为它使构建的速度非常慢。它还阻碍了不包含源代码的库项目的分发,限制库项目的使用范围。
字段不再是 final 的原因是意味着库jar包可以只编译一次,并且能直接在其他项目中复用。以及允许分发库项目的二进制版本(将在
r15出现),这使得构建更快。
然而,它对库的源码也有一个影响。以下形式的代码将不再能够编译:
int id = view.get