Котлин - что за аргументы "const"

Уже выяснено, какая разница между val и const val здесь.

Но мой вопрос: зачем нам использовать ключевое слово const? От сгенерированной перспективы Java-кода нет никакой разницы.

Этот код Котлина:

class Application

private val testVal = "example"

private const val testConst = "another example"

Формирует:

public final class ApplicationKt
{
    private static final String testVal = "example";
    private static final String testConst = "another example";
}
+2
источник поделиться
6 ответов

Это не всегда тот же сгенерированный код.

Если testVal и testConst были public, сгенерированный код не был бы таким же. testVal будет private с public get, в то время как testConst бы public, без каких - либо геттер. Таким образом, const избегает генерации геттера.

+1
источник

Как указано в документации, testConst можно использовать в параметрах аннотации, но testVal не может.

В более общем смысле, const гарантирует, что у вас есть постоянная переменная в том смысле, Java и

Независимо от того, является ли переменная постоянной или нет, она может иметь последствия для инициализации класса (§12.4.1), бинарной совместимости (§13.1), достижимости (§14.21) и определенного назначения (§16.1.1).

+1
источник

На мой взгляд, основное отличие состоит в том, что val означает, что для свойства не будет генерироваться сеттер (но будет генерироваться getter), а не то, что значение является постоянным, а const val является константой (например, Java private/public static final xxx).

Пример:

class Foo {
    private val testVal: String
        get() = Random().nextInt().toString()
}   
0
источник

Существуют также различия в их использовании.

Пример констант (Котлин):

class Constants {
    companion object {
        val EXAMPLE1 = "example1" // need companion and a getter
        const val EXAMPLE2 = "example2" // no getter, but companion is generated and useless
        @JvmField val EXAMPLE3 = "example3"; // public static final with no getters and companion
    }
}

Как использовать (Java):

public class UseConstants {
    public void method(){
        String ex1 = Constants.Companion.getEXAMPLE1();
        String ex2 = Constants.EXAMPLE2;
        String ex3 = Constants.EXAMPLE3;
    }
}
0
источник

Вы не видите разницу между сгенерированным кодом, потому что ваши переменные являются private. В противном случае результат будет иметь getter для testVal:

  public final class ApplicationKt {
       @NotNull
       private static final String testVal = "example";
       @NotNull
       public static final String testConst = "another example";

       @NotNull
       public static final String getTestVal() {
          return testVal;
       }
    }

Таким образом, в вашем конкретном случае это одно и то же, за исключением того, что вы можете использовать свойства const в annotations:

const val testVal: String = "This subsystem is deprecated"
@Deprecated(testVal) fun foo() { ... }
0
источник

"Consts" - это константы времени компиляции, тогда как "val" используется для определения констант во время выполнения. Это означает, что "consts" никогда не может быть назначен функции или любому конструктору класса, а только String или примитиву.

Пример:

const val NAME = "M Sakamoto"
val PICon = getPI()

fun getPI(): Double {
 return 3.14
}

fun main(args: Array<String>) {
  println("Name : $NAME")
  println("Value of PI : $PICon")
 }

Выход:

Name : M Sakamoto
Value of PI : 3.14
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос