In Kotlin wordt het trefwoord const val gebruikt om compile-time constanten te declareren, dat wil zeggen waarden die bekend en berekend worden tijdens de compilatiefase.
const val is alleen beschikbaar voor top-level variabelen, of voor eigenschappen die zijn gedeclareerd in object-objecten of companion object.String, numerieke primitieve types of Boolean.val is een onveranderlijke variabele, maar de waarde kan tijdens runtime worden vastgesteld, wat berekeningen of functiebewerkingen tijdens de initialisatie kan toestaan:
val timestamp = System.currentTimeMillis() // Dit is GEEN const val const val APP_NAME = "MyApp" // Dit is een compile-time constante
In annotaties kan alleen const val worden gebruikt, voorbeeld:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
Als je probeert val in dergelijke gevallen te gebruiken, krijg je een compileerfout.
Waarom kan je geen
const valbinnen een gewone klasse declareren?
Antwoord: Omdat const val vereist dat de variabele beschikbaar is tijdens de compilatiefase, en de instantievariabelen van een klasse worden pas geïnitialiseerd tijdens de creatie van een object, waardoor ze geen compile-time constanten kunnen zijn.
class Example { // Fout! Kan niet zo // const val CLASS_NAME = "MyClass" }
Geschiedenis
De build is mislukt omdat de ontwikkelaar probeerde een berekend waarde op het moment van uitvoering door te geven via een annotatie.
De ontwikkelaar heeft gedeclareerd:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
Het project compileerde niet, omdat alleen const val kan worden gebruikt in argumenten van annotaties!
Geschiedenis
Fout op Android: poging om lokale variabelen als constante sleutels in Intent te gebruiken.
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
In sommige tools of frameworks wordt const val verwacht in plaats van gewone val — anders zien IDE of Android-resources deze waarden niet als compile-time constanten.
Geschiedenis
Gebruik van een verkeerde type voor const val.
const val LIST = listOf(1,2,3) // Fout! Alleen primitieve types en String.
Onwetendheid over de typebeperkingen leidde tot een compileerfout en verlies van tijd.