当前位置:   article > 正文

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这是因为该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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这通常在 UI 代码中,对性能的影响可以忽略不计。

PS 如果您的 switch 语句如下所示:

switch (view.getId()) {
  • 1

那么你最终会得到一个效率低下的if/else链,其中每个if检查都重复 view.getId() 调用。只需先提取这个表达式(使用“提取局部变量”重构击键),然后转换 switch 语句。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/962532
推荐阅读
相关标签
  

闽ICP备14008679号