In Kotlin, la parola chiave const val viene utilizzata per dichiarare costanti a tempo di compilazione, ovvero valori noti e calcolati durante la fase di compilazione.
const val è disponibile solo per variabili top-level, oppure per proprietà dichiarate in oggetti object o companion object.String, tipi primitivi numerici o Boolean.val è una variabile immutabile, ma il valore può essere assegnato durante l'esecuzione, il che consente calcoli o chiamate a funzioni durante l'inizializzazione:
val timestamp = System.currentTimeMillis() // Questo NON è const val const val APP_NAME = "MyApp" // Questa è una costante a tempo di compilazione
Nelle annotazioni è possibile utilizzare solo const val, esempio:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
Se si tenta di utilizzare val in tali casi, ci sarà un errore di compilazione.
Perché non si può dichiarare
const valall'interno di una classe normale?
Risposta: Perché const val richiede che la variabile sia accessibile durante la compilazione, mentre le variabili di istanza della classe vengono inizializzate solo durante la creazione dell'oggetto, quindi non possono essere costanti a tempo di compilazione.
class Example { // Errore! Non si può fare così // const val CLASS_NAME = "MyClass" }
Storia
La compilazione è fallita perché lo sviluppatore ha cercato di passare un valore calcolato al momento dell'esecuzione attraverso un'annotazione.
Lo sviluppatore ha dichiarato:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
Il progetto non si compilava, poiché solo const val può essere utilizzato come argomento delle annotazioni!
Storia
Errore su Android: tentativo di utilizzare variabili locali come chiavi costanti in Intent.
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
In alcuni strumenti o framework, ci si aspetta const val, e non il normale val — altrimenti l'IDE o le risorse Android non vedono questi valori come costanti a tempo di compilazione.
Storia
Utilizzo di un tipo inappropriato per const val.
const val LIST = listOf(1,2,3) // Errore! Solo primitivi e String.
La mancanza di conoscenza delle limitazioni dei tipi ha portato a un errore di compilazione e a una perdita di tempo.