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()
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.
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.