Achtergrond:
In Kotlin wordt de toegang tot eigenschappen bereikt via getter- en setter-methoden. Om een betere prestatie te bereiken, hebben ontwikkelaars de inline modifier voor accessors toegevoegd, waardoor de JVM oproepen kan optimaliseren tijdens de compilatie door de get/set body direct in de aanroepende code in te voegen.
Probleem:
Gewone accessor-methoden worden voor elke eigenschap gemaakt, wat de overhead van de oproep verhoogt (vooral bij frequente toegang tot deze methoden). Soms gebruiken ontwikkelaars een aparte get/set om de logica te verplaatsen, maar willen ze de overhead van een functie-aanroep vermijden.
Oplossing:
Gebruik de inline modifier voor de getter of setter als hun implementatie kort is en er geen zware code is. Dit vermindert de overhead, vooral in een hot-path. Let op: inlining werkt alleen voor top-level eigenschappen en eigenschappen in companion objecten en object-objecten, en niet voor gewone klassen vanwege de principes van JVM-erfelijkheid.
Voorbeeldcode:
inline var Int.asHex: String get() = Integer.toHexString(this) set(value) {} inline val String.firstUpperCase: String get() = if (isEmpty()) this else this[0].uppercase() + substring(1)
Belangrijke kenmerken:
Kan inline get/set worden gebruikt met gewone klasse-eigenschappen?
Nee, inlining voor getters en setters is alleen toegestaan voor top-level of object (inclusief companion object) eigenschappen, niet voor eigenschappen binnen klassen, om problemen met erfelijkheid te vermijden.
Is toegang tot de backing field (ondersteunend veld) beschikbaar in inline accessor?
Nee, inline accessor heeft geen backing field, een poging om er toegang toe te krijgen resulteert in een compilatiefout.
Heeft inlining accessor altijd invloed op de bytecode?
Inlining geeft alleen de compiler een hint dat de code ingebouwd kan worden. De JIT-compiler kan dit in sommige gevallen negeren. Bovendien, als de accessor zware logica bevat, kan het verkregen effect het tegenovergestelde zijn.
In een project werd een grote eigenschap inline gedeclareerd, maar in de getter wordt zware transformatie verwerkt die in een lus wordt gebruikt. Het resultaat is dat de uiteindelijke bytecode opzwelt, JIT schakelt inlining uit, de prestatie daalt.
Voordelen:
Nadelen:
Een inline val werd gedeclareerd voor de conversie van een nummer in een string. De getter wordt vaak aangeroepen in UI-code. De prestatie bleef hoog, de bytecode compacter.
Voordelen:
Nadelen: