kotlin中的java static final:Const'val'初始化器应该是一个常量值

lym*_*oge 7 const kotlin

在Java中,我们可以这样做:

public class TestA {
    public static final boolean flag = true;
    public static final String str = flag ? "A" : "B"; // ok
}
Run Code Online (Sandbox Code Playgroud)

但不能在科特林

 class TestA {
    companion object {
        const val flag = true
        const val str = if (flag) "A" else "B" //err: Const 'val' initializer should be a constant value

        val str2 = if (flag) "A" else "B" //ok, but not equals [public static final] in Java.
    }
}
Run Code Online (Sandbox Code Playgroud)

在非const str2上试过@JvmStatic,但反编译成java代码,就是这样

private static final String str2 = "A"
public static final String getStr2() {
      return Companion.getStr2();
   }
Run Code Online (Sandbox Code Playgroud)

问题:kotlin if-else等于?:在java中,但不能用于const val.需要解决方案.

cha*_*l03 14

Kotlin,const关键字只应在值为编译时常量时使用.在你的情况下,它不是(const val str = if (flag) "A" else "B").您正在使用if条件将值传递给str非编译时常量的条件.

因此,您只需删除const关键字,它就能完美运行.因为val在Java中创建与final相同的不可变变量.但是有一个权衡,如果const被删除.它将在引擎盖下生成不必要的对象和getter以访问该变量.要解决这个问题,请使用@JvmField注释,你很高兴.

要了解更多信息,请访问我应该在Kotlin中保留常量的位置?

希望能帮助到你.