En Kotlin, le mot-clé const val est utilisé pour déclarer des constantes de compilation, c'est-à-dire des valeurs connues et calculées au moment de la compilation.
const val est uniquement disponible pour les variables top-level, ou pour les propriétés déclarées dans des objets object ou des companion object.String, primitives numériques ou Boolean.val est une variable immuable, mais la valeur peut être assignée à l'exécution, ce qui permet des calculs ou des appels de fonctions lors de l'initialisation:
val timestamp = System.currentTimeMillis() // Ce n'est PAS un const val const val APP_NAME = "MyApp" // C'est une constante de compilation
Dans les annotations, seul const val peut être utilisé, exemple:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
Si vous essayez d'utiliser val dans ces cas, vous obtiendrez une erreur de compilation.
Pourquoi ne peut-on pas déclarer
const valà l'intérieur d'une classe ordinaire ?
Réponse : Parce que const val exige que la variable soit accessible au moment de la compilation, et les variables d'instance de classe ne sont initialisées qu'au moment de la création de l'objet, donc elles ne peuvent pas être des constantes de compilation.
class Example { // Erreur ! On ne peut pas faire ça // const val CLASS_NAME = "MyClass" }
Histoire
La compilation a échoué parce qu'un développeur a essayé de passer une valeur calculée au moment de l'exécution via une annotation.
Le développeur a déclaré :
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
Le projet ne se compilait pas, car seul const val peut être utilisé dans les arguments des annotations !
Histoire
Erreur sur Android : tentative d'utiliser des variables locales comme clés constantes dans Intent.
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
Dans certains outils ou frameworks, const val est attendu, et non un val ordinaire— sinon, l'IDE ou les ressources Android ne voient pas ces valeurs comme des constantes de compilation.
Histoire
Utilisation d'un type inapproprié pour const val.
const val LIST = listOf(1,2,3) // Erreur ! Seulement des primitives et String.
Ignorer les restrictions de type a entraîné une erreur de compilation et une perte de temps.