Was ist der Unterschied zwischen "const" und "val"?

276

Ich habe kürzlich über das constSchlüsselwort gelesen und bin so verwirrt! Ich kann keinen Unterschied zwischen constund dem valSchlüsselwort feststellen. Ich meine, wir können beide verwenden, um eine unveränderliche Variable zu erstellen. Fehlt mir noch etwas?

Mathew Hany
quelle

Antworten:

388

consts sind Kompilierungszeitkonstanten. Dies bedeutet, dass ihr Wert während der Kompilierungszeit zugewiesen werden muss, im Gegensatz zu vals, wo dies zur Laufzeit erfolgen kann.

Dies bedeutet, dass consts niemals einer Funktion oder einem Klassenkonstruktor zugewiesen werden kann, sondern nur einem Stringoder einem Grundelement.

Beispielsweise:

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

const val bar = "Hello world"           //Also okay
Luka Jacobowitz
quelle
3
Was ist mit so etwas: const val foo = "Hello world"und val bar = "Hello world"? Sind sie gleich?
Mathew Hany
5
@MathewHany, zumindest nicht in Bezug auf Bytecode, siehe: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
Hotkey
4
Ich denke, constWerte werden beim Kompilieren nur vollständig eingeblendet.
Luka Jacobowitz
102
Dies wirft eine andere Frage auf: Warum benötigt Kotlin const valstatt nur const? Es scheint mir, dass das valSchlüsselwort in diesem Zusammenhang völlig überflüssig ist, da const vares auf den ersten Blick absurd wäre.
Eric Lloyd
18
@EricLloyd Mit const val, constist ein Modifikator auf valeher als ein Schlüsselwort. Modifikatoren> Schlüsselwörter. Weitere Beispiele für diesen baugleich sind, annotation/enum/data class, private val, inline funetc.
Aro
38

Nur um Lukas Antwort zu ergänzen:

Kompilierungszeitkonstanten

Eigenschaften, deren Wert zur Kompilierungszeit bekannt ist, können mit dem Modifikator const als Kompilierungszeitkonstanten markiert werden. Solche Eigenschaften müssen die folgenden Anforderungen erfüllen:

  • Oberste Ebene oder Mitglied einer Objektdeklaration oder eines Begleitobjekts .
  • Initialisiert mit einem Wert vom Typ String oder einem primitiven Typ
  • Kein Custom Getter

Solche Eigenschaften können in Anmerkungen verwendet werden.

Quelle: Offizielle Dokumentation

EPadronU
quelle
21

Sie können den Kotlin in Java umwandeln. Dann können Sie sehen, dass const einen statischen Modifikator mehr als val hat . Der einfache Code wie dieser.

Kotlin:

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

Nach Java (Teil):

@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
quelle
2
Könnte jemand in einem Kommentar angeben, warum diese Antwort in Vergessenheit geraten ist?
James Jordan Taylor
3
@ JamesJordanTaylor Ich habe gestimmt. Aber ich nehme an, es liegt daran, dass einige Leute es nicht sorgfältig gelesen haben, und auf den ersten Blick scheint diese Antwort darüber zu sprechen, wie man von Java zu Kotlin konvertiert, was nicht zum Thema gehört.
user1032613
2
Was constist, wenn es entfernt wird, wird es eine andere Java-Datei ergeben?
DYS
2
@DYS: Ich denke, es wird die "statische" entfernen und es wird nur öffentlich sein Final String str = "hallo";
Varun Ajay Gupta
4

const kotlin nach Java

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

val kotlin nach Java

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

In einfacher Sprache

  1. Der Wert der Variablen const ist zur Kompilierungszeit bekannt.
  2. Der Wert von val wird verwendet, um Konstanten zur Laufzeit zu definieren.

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

Dies liegt daran, dass getCar () zur Laufzeit ausgewertet wird und den Wert Car zuweist.

Zusätzlich -

  1. val ist schreibgeschützt bedeutet unveränderlich, was zur Laufzeit bekannt ist
  2. var ist veränderbar, was zur Laufzeit bekannt ist
  3. const sind unveränderlich und Variablen, die zur Kompilierungszeit bekannt sind
Shivam Tripathi
quelle
4

Beides valund constsind unveränderlich.

constwird verwendet, um Konstanten valfür die Kompilierungszeit zu deklarieren, während dies für Laufzeitkonstanten gilt.

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

val PICon = getIP()  // Assignment done at run-time
Kifayat Ullah
quelle
2

In Kotlin, constund valbeide stellen die Unveränderlichkeit und nur Werte gelesen und als handeln finalSchlüsselwort in Java.

valDas Schlüsselwort muss verwendet werden, um Laufzeitwerte constzu deklarieren, und das Schlüsselwort muss verwendet werden, um Kompilierungszeitwerte zu deklarieren.

Beachten Sie, dass const nur mit primitiven Datentypen verwendet werden darf, nicht für Funktionen und Konstruktoren.

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
quelle