Qual è la differenza tra "const" e "val"?


295

Ho letto di recente della constparola chiave e sono così confuso! Non riesco a trovare alcuna differenza tra conste la valparola chiave, voglio dire che possiamo usarle entrambe per creare una variabile immutabile, c'è qualcos'altro che mi manca?



Risposte:


421

consts sono costanti del tempo di compilazione. Significa che il loro valore deve essere assegnato durante la compilazione, a differenza di vals, dove può essere eseguito in fase di esecuzione.

Ciò significa che consts non può mai essere assegnato a una funzione oa un costruttore di classi, ma solo a una Stringo primitiva.

Per esempio:

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

const val bar = "Hello world"           //Also okay

3
Che ne dici di qualcosa del genere: const val foo = "Hello world"e val bar = "Hello world"? Sono gli stessi?
Mathew Hany

5
@MathewHany, almeno non in termini di bytecode, vedi: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
hotkey

4
Penso che i constvalori saranno completamente integrati durante la compilazione.
Luka Jacobowitz

110
Ciò solleva un'altra domanda: perché Kotlin richiede const valinvece di solo const? Mi sembra che la valparola chiave sia del tutto superflua in questo contesto, poiché const varsarebbe assurdo in apparenza.
Eric Lloyd

21
@EricLloyd With const val, constè un modificatore valpiuttosto che una parola chiave. Modificatori> parole chiave. Altri esempi di questo stesso design sono, annotation/enum/data class, private val, inline fun, ecc
Aro

40

Solo per aggiungere alla risposta di Luka:

Costanti in fase di compilazione

Le proprietà il cui valore è noto in fase di compilazione possono essere contrassegnate come costanti del tempo di compilazione utilizzando il modificatore const. Tali proprietà devono soddisfare i seguenti requisiti:

Tali proprietà possono essere utilizzate nelle annotazioni.

Fonte: documentazione ufficiale


22

Puoi trasformare Kotlin in Java. Quindi puoi vedere const ha un modificatore statico in più rispetto a val . Il codice semplice come questo.

Kotlin:

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

In Java (porzione):

@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
Qualcuno potrebbe affermare in un commento perché questa risposta è stata votata all'oblio?
James Jordan Taylor

3
@JamesJordanTaylor I voto positivo. Ma presumo sia perché alcune persone non l'hanno letto attentamente, ea una rapida occhiata questa risposta sembra parlare di come convertire da java a kotlin, che sarebbe fuori tema.
user1032613

2
E se constviene rimosso, produrrà un file Java diverso?
DYS

2
@DYS: penso che rimuoverà la "statica" e sarà solo la stringa finale pubblica str = "ciao";
Varun Ajay Gupta

8

const kotlin in Java

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

val kotlin a Java

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

In un linguaggio semplice

  1. Il valore della variabile const è noto in fase di compilazione.
  2. Il valore di val viene utilizzato per definire le costanti in fase di esecuzione.

Esempio 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"
}

Questo perché getCar () viene valutato in fase di esecuzione e assegna il valore a Car.

Inoltre -

  1. val è di sola lettura significa immutabile noto in fase di esecuzione
  2. var è mutabile noto in fase di esecuzione
  3. const sono immutabili e variabili note in fase di compilazione

5

Entrambi vale constsono immutabili.

constviene utilizzato per dichiarare le costanti in fase di compilazione, mentre valper le costanti in fase di esecuzione.

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

val PICon = getIP()  // Assignment done at run-time

5

In kotlin, consted valentrambi rappresentano l'immutabilità e i valori di sola lettura e agiscono come finalparola chiave in java.

valLa parola chiave deve essere utilizzata per dichiarare i valori in fase di esecuzione e la constparola chiave deve essere utilizzata per dichiarare i valori in fase di compilazione.

Tieni presente che const deve essere utilizzato solo con tipi di dati primitivi, non per funzioni e costruttori.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.