ProgrammatieKotlin ontwikkelaar / Performance engineer

Hoe werken inline property accessors (inline getters en setters) in Kotlin? Wat zijn de bijzonderheden en nuances van hun gebruik, hoe beïnvloeden ze de prestaties en waar kunnen onverwachte fouten optreden? Geef een voorbeeld.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Kotlin staat toe dat getters en setters van properties worden gemarkeerd met de modifier inline. Dit geeft de compiler het recht om de code van de accessor rechtstreeks in de aanroepplaatsen in te bedden voor prestatie-optimalisatie.

Voorbeeld:

val foo: Int inline get() = expensiveCalculation()
  • Door de inline-functie heeft de getter geen overheadkosten bij aanroep (bijvoorbeeld in lussen) als de accessor code kort is.
  • Inline is alleen mogelijk voor stateless getters; niet alle logica mag inline zijn.
  • inline kan niet worden gebruikt voor getters/setters als ze reified generics of lambda-expressies met cross-linking bevatten.

Best practices: gebruik inline accessors alleen voor zeer korte, vaak aangeroepen expressies zonder bijeffecten.


Vraag met een valstrik

Als je een property met een inline getter/setter een annotatie met reflectie toevoegt (bijvoorbeeld door gebruik te maken van KProperty), zal inline dan werken?

Antwoord: Nee. Als de property wordt gebruikt via de reflection API of verwijst naar KProperty, kan de compiler de getter/setter niet inbedden, en blijven ze gewone methoden. Inline gebeurt alleen bij directe verwijzing in de code.


Geschiedenis

Prestatieverlies door reflectie bij inline getter:

We herschreven een veelgebruikt property naar een inline getter, in de hoop overbodige aanroepen te vermijden. Later voegden we validatie toe via KProperty — hierdoor gebeurden de aanroepen via reflectie, waardoor het voordeel van de inline accessor volledig werd tenietgedaan.


Geschiedenis

Ongewenste bijeffecten bij inlining:

De inline getter deed logging:

inline get() { println("toegang!") return field }

Deze implementatie leidde tot onverwachte logging op verschillende plaatsen, omdat de property vaak werd gelezen in verschillende delen van de code, wat de logs sterk vervuilde.


Geschiedenis

Breken van ABI door wijziging van inline-property:

We wijzigden de logica van de inline getter in een bibliotheek zonder de afhankelijkheden opnieuw te bouwen, klanten bleven de oude handtekening gebruiken — uitgebreide ABI plus inlining leidde tot incompatibiliteit en verborgen fouten bij klanten na de update.