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

时间:2017-09-29 05:57:44

标签: kotlin const

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

public class TestA {
    public static final boolean flag = true;
    public static final String str = flag ? "A" : "B"; // ok
}

但不能在Kotlin

 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.
    }
}

在非const str2 上尝试 @JvmStatic ,但反编译为java代码,它是

private static final String str2 = "A"
public static final String getStr2() {
      return Companion.getStr2();
   }

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

1 个答案:

答案 0 :(得分:12)

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

因此,您只需删除const关键字,即可完美运行。因为val在Java中创建与final相同的不可变变量。但如果const被删除,则需要权衡。它将在引擎盖下生成不必要的对象和getter以访问该变量。要解决此问题,请使用@JvmField注释,您可以继续使用。

要了解详情,请转到Where Should I Keep My Constants in Kotlin?

希望它有所帮助。