java static final в kotlin: инициализатор Const 'val' должен быть постоянным значением

В Java мы можем это сделать:

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

Но не может в Котлине

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

Пробовал @JvmStatic на non-const str2 , но декомпилировался в java-код, это

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

Проблема: kotlin if-else равно ?: В java, но cannnot использовать для const val. для этого нужно решение.

    В Kotlin ключевое слово const должно использоваться только тогда, когда значение является константой времени компиляции. В вашем случае это не ( const val str = if (flag) "A" else "B" ). Вы используете условие, чтобы передать значение str на условие, которое не является константой времени компиляции.

    Таким образом, вы просто удаляете ключевое слово const и оно будет работать отлично. Поскольку val создает неизменяемые переменные, такие же, как final в Java. Но есть компромисс, если const удаляется. Он под капотом генерирует ненужный объект и getter для доступа к этой переменной. Чтобы решить эту проблему, используйте аннотацию @JvmField и вам хорошо идти.

    Чтобы больше узнать, где я должен сохранять свои константы в Котлине?

    Надеюсь, поможет.