ProgrammierungAndroid-Entwickler / Backend-Entwickler

Wie funktionieren die Initialisierung von konstanten Werten (const val) und Compile-Time-Konstanten in Kotlin? Was ist der Unterschied zu normalen val, welche Einschränkungen gibt es, wie wird es für Annotationen verwendet und warum kann man const val nicht immer dort verwenden, wo man möchte?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In Kotlin wird das Schlüsselwort const val zur Deklaration von Compile-Time-Konstanten verwendet, d.h. von Werten, die zur Kompilierungszeit bekannt und berechnet werden.

  • const val ist nur für top-level Variablen oder für Eigenschaften, die in object-Objekten oder companion object deklariert sind, verfügbar.
  • Der Wert muss folgende Typen haben: String, primitive numerische Typen oder Boolean.
  • Es wird für Annotationen und Dekoratoren verwendet, wo der Wert zur Kompilierungszeit eingesetzt werden muss.

val ist eine unveränderliche Variable, aber der Wert kann zur Laufzeit zugewiesen werden, was Berechnungen oder Funktionsaufrufe während der Initialisierung erlaubt:

val timestamp = System.currentTimeMillis() // Das ist KEIN const val const val APP_NAME = "MyApp" // Das ist eine Compile-Time-Konstante

In Annotationen kann nur const val verwendet werden, Beispiel:

const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Beispiel

Wenn man versucht, val in solchen Fällen zu verwenden, gibt es einen Kompilierungsfehler.


Fangfrage

Warum kann man const val nicht innerhalb einer normalen Klasse deklarieren?

Antwort: Weil const val erfordert, dass die Variable zur Kompilierungszeit verfügbar ist, und Instanzvariablen einer Klasse nur bei der Erstellung des Objekts initialisiert werden, können sie daher keine Compile-Time-Konstanten sein.

class Beispiel { // Fehler! So geht's nicht // const val CLASS_NAME = "MyClass" }

Geschichte

Der Build brach zusammen, weil der Entwickler versuchte, einen zur Laufzeit berechneten Wert über eine Annotation zu übergeben.

Der Entwickler hatte erklärt:

val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App

Das Projekt ließ sich nicht kompilieren, da nur const val in den Argumenten von Annotationen verwendet werden kann!


Geschichte

Fehler auf Android: Versuch, lokale Variablen als konstante Schlüssel in Intent zu verwenden.

class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)

In einigen Tools oder Frameworks wird const val erwartet, nicht das übliche val – andernfalls erkennt die IDE oder die Android-Ressourcen diese Werte nicht als Compile-Time-Konstanten.


Geschichte

Benutzung eines inkompatiblen Typs für const val.

const val LIST = listOf(1,2,3) // Fehler! Nur Primitive und String.

Unkenntnis über die Typbeschränkungen führte zu einem Kompilierungsfehler und zu Zeitverlust.