ProgrammatieBackend ontwikkelaar

Wat is het verschil tussen de sleutelwoorden "val" en "var" in Kotlin? Hoe deze optimaal te gebruiken vanuit het perspectief van veiligheid en prestaties van de code?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

val en var worden beide gebruikt om variabelen te declareren, maar ze hebben fundamentele verschillen:

  • val (value): verklaart een onveranderlijke, alleen-lezen referentie. Na initialisatie kan de waarde niet opnieuw worden toegewezen, de referentie blijft voor altijd naar één object:
val number = 42 // number = 10 // fout!
  • var (variable): verklaart een veranderlijke variabele;
var counter = 0 counter++ // toegestaan

Veiligheid en prestaties:

  • Het is beter om val te gebruiken waar de variabele niet mag veranderen — dit beschermt tegen toevallige wijzigingen en maakt de code makkelijker te begrijpen.
  • Het gebruik van val stelt de compiler en IDE in staat om fouten tijdens de compilatie op te vangen en de code te optimaliseren.

Vraag met een valstrik.

Kan een object dat als val is gedeclareerd worden gewijzigd?

Verluid: De waarde van de variabele zelf (referentie) kan niet opnieuw worden toegewezen, maar als het een object is (bijvoorbeeld een lijst), kan de interne toestand worden gewijzigd.

val list = mutableListOf(1,2) list.add(3) // Mag! Maar list = eenAndereLijst zal een fout zijn.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


Verhaal

In het project van een webwinkel had de ontwikkelaar de lijst met producten gedefinieerd als val items = mutableListOf<Product>(), denkende dat de lijst volledig onveranderlijk was. In werkelijkheid was de lijst in een andere sectie gewijzigd (een nieuw element toegevoegd), wat onverwacht invloed had op de weergave van de winkelwagentjes.


Verhaal

In een parser voor grote tekstbestanden was de array-buffer gedeclareerd als var buffer, hoewel het tijdens het parseren niet vervangen hoefde te worden. Per ongeluk werd het opnieuw toegewezen aan een nieuwe array, wat leidde tot geheugenlekken en onjuiste gegevensverwerking.


Verhaal

In de code van een microservice werden de meeste variabelen als var gedeclareerd "voor het geval", wat resulteerde in het soms veranderen van de toestand van het object in verschillende threads, wat leidde tot hard te traceren bugs door race conditions.