ProgrammazioneSviluppatore Android / Sviluppatore Backend

Как работает инициализация константных значений (const val) и compile-time констант в Kotlin? В чем отличие от обычного val, какие есть ограничения, как используется для аннотаций и почему не всегда можно использовать const val там, где хочется?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.
  • Il valore deve essere di tipo: String, tipi primitivi numerici o Boolean.
  • Viene utilizzato per annotazioni e decoratori, dove il valore deve essere inserito durante la compilazione.

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.


Domanda insidiosa

Perché non si può dichiarare const val all'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.