ProgrammatieAndroid-ontwikkelaar / Backend-ontwikkelaar

Hoe werkt de initialisatie van constante waarden (const val) en compile-time constanten in Kotlin? Wat is het verschil met gewone val, wat zijn de beperkingen, hoe wordt het gebruikt voor annotaties en waarom kan const val niet altijd gebruikt worden waar je wilt?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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.
  • De waarde moet van de typen zijn: String, numerieke primitieve types of Boolean.
  • Het wordt gebruikt voor annotaties en decorateurs, waar de waarde tijdens de compilatie moet worden ingevoegd.

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.


Vragen met een valstrik

Waarom kan je geen const val binnen 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.