Jaka jest różnica między „const” a „val”?

276

Niedawno przeczytałem o tym constsłowie kluczowym i jestem tak zdezorientowany! Nie mogę znaleźć żadnej różnicy między consti valsłowa kluczowego, to znaczy możemy korzystać zarówno z nich, aby zmienną niezmienny, jest jeszcze coś, co mi brakuje?

Mathew Hany
źródło

Odpowiedzi:

388

consts są stałymi czasowymi kompilacji. Oznacza to, że ich wartość należy przypisać w czasie kompilacji, w przeciwieństwie do vals, gdzie można to zrobić w czasie wykonywania.

Oznacza to, że constnigdy nie można przypisać funkcji ani konstruktora żadnej klasy, ale tylko funkcji Stringpierwotnej.

Na przykład:

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

const val bar = "Hello world"           //Also okay
Luka Jacobowitz
źródło
3
Co powiesz na coś takiego: const val foo = "Hello world"i val bar = "Hello world"? Czy oni są tacy sami?
Mathew Hany
5
@MathewHany, przynajmniej nie pod względem kodu bajtowego, patrz: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
skrót
4
Myślę, że constpodczas kompilacji wartości będą całkowicie uwzględniane.
Luka Jacobowitz
102
To nasuwa kolejne pytanie: dlaczego Kotlin wymaga const valzamiast sprawiedliwego const? Wydaje mi się, że valsłowo kluczowe jest w tym kontekście całkowicie zbędne, ponieważ const varbyłoby absurdalne na pierwszy rzut oka.
Eric Lloyd,
18
@EricLloyd Z const val, constto modyfikator na valzamiast słowa kluczowego. Modyfikatory> słowa kluczowe. Inne przykłady tej samej konstrukcji, są annotation/enum/data class, private val, inline funitp
Aro
38

Aby dodać do odpowiedzi Luki:

Stałe czasowe kompilacji

Właściwości, których wartość jest znana w czasie kompilacji, można oznaczyć jako stałe czasowe kompilacji za pomocą modyfikatora const. Takie właściwości muszą spełniać następujące wymagania:

Takie właściwości można wykorzystać w adnotacjach.

Źródło: oficjalna dokumentacja

EPadronU
źródło
21

Możesz przekształcić Kotlin w Javę. Wtedy zobaczysz, że const ma jeszcze jeden statyczny modyfikator niż val . Prosty kod taki jak ten.

Kotlin:

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

Do Java (część):

@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;
   }
}
Jin Wang
źródło
2
Czy ktoś mógłby powiedzieć w komentarzu, dlaczego ta odpowiedź została poświęcona zapomnieniu?
James Jordan Taylor,
3
@JamesJordanTaylor I głosował. Ale zakładam, że dzieje się tak, ponieważ niektórzy nie czytali go uważnie i na pierwszy rzut oka wydaje się, że ta odpowiedź mówi o tym, jak przejść z java na kotlin, co byłoby nie na temat.
user1032613,
2
Co się stanie, jeśli constzostanie usunięty, czy da inny plik Java?
DYS
2
@DYS: Myślę, że usunie to „statyczne” i będzie to po prostu publiczny końcowy ciąg str = "hello";
Varun Ajay Gupta
5

Zarówno vali constsą niezmienne.

constsłuży do deklarowania stałych czasu kompilacji, podczas gdy valdla stałych czasu wykonywania.

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

val PICon = getIP()  // Assignment done at run-time
Kifayat Ullah
źródło
4

const kotlin do Java

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

val kotlin do Java

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

W prostym języku

  1. Wartość zmiennej const jest znana w czasie kompilacji.
  2. Wartość val służy do definiowania stałych w czasie wykonywania.

Przykład 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"
}

Jest tak, ponieważ getCar () jest analizowany w czasie wykonywania i przypisuje wartość do Car.

Do tego -

  1. val jest tylko do odczytu oznacza niezmienny, który jest znany w czasie wykonywania
  2. var jest zmienny, który jest znany w czasie wykonywania
  3. const są niezmiennymi i zmiennymi znanymi w czasie kompilacji
Shivam Tripathi
źródło
3

W Kotlin, consti valoba reprezentują niezmienność i wartości tylko do odczytu i działają jako finalsłowo kluczowe w java.

valsłowo kluczowe musi być użyte do zadeklarowania wartości czasu wykonywania, a constsłowo kluczowe musi być użyte do zadeklarowania wartości czasu kompilacji.

Należy pamiętać, że const musi być używane tylko z prymitywnymi typami danych, a nie dla funkcji i konstruktorów.

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

Ajay Vishwakarma
źródło