ProgrammatieKotlin mobile developer

Wat zijn extensies (extension functions) in Kotlin en hoe gebruik je ze correct? Beschrijf de valkuilen van toepassing en geef een voorbeeld van code.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Extension functions/extensies zijn een mechanisme waarmee je nieuwe functies kunt toevoegen aan bestaande klassen zonder dat je de klasse hoeft uit te breiden of te wijzigen.

Bijvoorbeeld, voor de klasse String, laten we een functie toevoegen die een string omdraait:

fun String.reverse(): String { return this.reversed() } println("abc".reverse()) // "cba"

Extensies wijzigen de klasse eigenlijk niet, ze zijn gewoon syntactische suiker: ze worden gecompileerd als statische methoden die een instantie van het object als eerste parameter nemen.

Voordelen: beknoptheid, leesbaarheid, uitbreidbaarheid van de code. Ze passen goed bij utility-functies voor collecties, strings, enz.

Valkuilen:

  • Kunnen methoden van de klasse niet overschrijven/vervangen;
  • Hebben geen toegang tot privéleden van de klasse;
  • Bij naamconflicten heeft de instantie-methode voorrang, niet de extensie;
  • Extension property werkt alleen met getter/setter, niet met velden;

Misleidende vraag.

Is het mogelijk om met behulp van extension functions een nieuwe variabele (property) toe te voegen die de status van de klasse opslaat?

Gantwoord: Nee. Extension property is altijd een berekend eigenschap (getter/setter), geen veld. Ze kunnen geen status opslaan - alleen on-the-fly berekenen.

val String.secondChar: Char get() = this[1] // Alleen berekening, geen opslag!

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


Verhaal

In een project voor gegevensverificatie heeft een ontwikkelaar een extension property aan een modelklasse toegevoegd alsof het een waarde opsloeg, maar later ontdekte hij dat de waarde altijd werd berekend en niet werd onthouden, waardoor de logica verkeerd werkte bij meerdere aanroepen.


Verhaal

In een grote applicatie werden extensies vernoemd naar dezelfde naam als de methoden van de klasse, wat leidde tot verwarring: de methoden van de klasse hadden altijd voorrang, en de extensies werden niet aangeroepen - er werd een dag besteed aan het debuggen van de "onzichtbare" code.


Verhaal

In een van de bibliotheken werden extensies gebruikt voor privévelden van de klasse, maar later bleek dat ze helemaal geen toegang hadden tot private, waardoor de architectuur van de modellen moest worden herzien.