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.String, primitive numerische Typen oder Boolean.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.
Warum kann man
const valnicht 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.