Яка різниця між "const" і "val"?


276

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



Ви можете прочитати цю статтю android4dev.com/difference-between-var-val-and-const-in-kotlin або переглянути це відео youtube.com/watch?v=DQLrEGqSSI8&t=6s
Lokesh Desai

Відповіді:


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. Такі властивості повинні відповідати наступним вимогам:

Такі властивості можна використовувати в примітках.

Джерело: Офіційна документація


21

Ви можете перетворити Kotlin в Java. Тоді ви можете побачити, що у const є ще один статичний модифікатор, ніж val . Простий код, як це.

Котлін:

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

До Java (частина):

@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, що було б поза темою.
користувач1032613

2
Що робити, якщо його constбуде видалено, це дасть інший файл Java?
DYS

2
@DYS: Я думаю, що це видалить "статику", і це буде просто загальнодоступний String str = "привіт";
Варун Аджай Гупта

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 kotlin до Яви

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 () оцінюється під час виконання та присвоює значення Авто.

Додатково -

  1. val є незмінним для читання, відомим під час виконання
  2. var є змінним, що відомо під час виконання
  3. const - незмінні та змінні, які відомі під час компіляції

3

У kotlin, 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.