В чем разница между «const» и «val»?

276

Я недавно прочитал о constключевом слове, и я так растерялся! Я не могу найти никакой разницы между constи valключевое слово, я имею в виду , мы можем использовать оба из них , чтобы сделать неизменяемую переменную, есть что - нибудь еще , что я не хватает?

Мэтью Хани
источник
Вы можете прочитать эту статью android4dev.com/difference-between-var-val-and-const-in-kotlin или посмотреть это видео youtube.com/watch?v=DQLrEGqSSI8&t=6s
Локеш Десаи,

Ответы:

388

consts - константы времени компиляции. Это означает, что их значение должно быть назначено во время компиляции, в отличие от vals, где это может быть сделано во время выполнения.

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

Например:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay
Лука Якобовиц
источник
3
Как насчет этого: const val foo = "Hello world"а val bar = "Hello world"? Они одинаковы?
Мэтью Хани
5
@MathewHany, по крайней мере, не с точки зрения байт-кода, смотрите: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
горячая клавиша
4
Я думаю, что constзначения будут полностью встроены во время компиляции.
Лука Якобовиц
102
Напрашивается другой вопрос: почему Котлин требует, const valа не просто const? Мне кажется, что valключевое слово в данном контексте совершенно излишне, так как const varбыло бы абсурдно.
Эрик Ллойд
18
@EricLloyd With const val, constявляется модификатором, valа не ключевым словом. Модификаторы> ключевые слова. Другие примеры такого же конструкции являются, annotation/enum/data class, private val, inline funи т.д.
Аро
38

Просто чтобы добавить к ответу Луки:

Константы времени компиляции

Свойства, значение которых известно во время компиляции, могут быть помечены как константы времени компиляции с использованием модификатора const. Такие свойства должны соответствовать следующим требованиям:

Такие свойства можно использовать в аннотациях.

Источник: Официальная документация

EPadronU
источник
22

Вы можете преобразовать Kotlin в Java. Тогда вы можете увидеть, что const имеет еще один статический модификатор, чем val . Простой код, подобный этому.

Котлин:

const val str = "hello"
class SimplePerson(val name: String, var age: Int)

На Яву (Часть):

@NotNull
public static final String str = "hello";

public final class SimplePerson {
   @NotNull
   private final String name;
   private int age;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public SimplePerson(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }
}
Джин Ван
источник
2
Может ли кто-нибудь заявить в комментарии, почему этот ответ был забыт?
Джеймс Джордан Тейлор
3
@JamesJordanTaylor Я проголосовал. Но я предполагаю, что это потому, что некоторые люди не читали его внимательно, и на первый взгляд кажется, что этот ответ говорит о том, как перейти с Java на Kotlin, что было бы не по теме.
user1032613
2
Что делать, если constудалить, приведет ли это к другому файлу Java?
DYS
2
@DYS: я думаю, что это уберет "static" и будет просто public final String str = "hello";
Варун Аджай Гупта
5

Оба valи constнеизменны.

constиспользуется для объявления констант времени компиляции, тогда как valдля констант времени исполнения.

const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time

val PICon = getIP()  // Assignment done at run-time
Кифаят Улла
источник
4

Const Kotlin для Java

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

Валь Котлин на Яву

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

Простым языком

  1. Значение переменной const известно во время компиляции.
  2. Значение val используется для определения констант во время выполнения.

Пример 1-

const val Car_1 = "BUGATTI"val Car_2 = getCar() ✔    
const val Car_3 = getCar()//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

Это потому, что getCar () оценивается во время выполнения и присваивает значение Car.

Дополнительно -

  1. вал только для чтения означает неизменяемый, который известен во время выполнения
  2. переменная переменная, известная во время выполнения
  3. const неизменны и переменные, которые известны во время компиляции
Шивам Трипати
источник
3

В Котлин, constи valкак представляет собой неизменность и только для чтения значения и действуют в качестве finalключевого слова в Java.

val ключевое слово должно использоваться для объявления значений времени выполнения и const ключевое слово должно использоваться для объявления значений времени компиляции.

Имейте в виду, const должен использоваться только с примитивными типами данных, а не для функций и конструкторов.

Example -

const val fun1 = anyFunctionOrConstructor() // it is not fine
    val fun2 = anyFunctionOrConstructor() // it is perfectly fine
    
    const val aa = "My String" // it is perfectly fine

Аджай Вишвакарма
источник