ProgrammationDéveloppeur Android / Développeur Backend

Comment fonctionne l'initialisation des valeurs constantes (const val) et des constantes de compilation à l'aide de Kotlin ? Quelle est la différence avec un val ordinaire, quelles sont les restrictions, comment ça s'utilise pour les annotations et pourquoi on ne peut pas toujours utiliser const val là où on le souhaite ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.
  • La valeur doit être de type : String, primitives numériques ou Boolean.
  • Utilisé pour les annotations et les décorateurs, où la valeur doit être substituée au moment de la compilation.

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.


Question piège

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.