DevEco AS 错误: 需要常量表达式

在常规的 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 语句。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值