Kotlin consente di contrassegnare gli accessori di proprietà con il modificatore inline. Questo dà al compilatore il diritto di inlinare (incorporare) il codice dell'accessore direttamente nei punti di chiamata per ottimizzare le prestazioni.
Esempio:
val foo: Int inline get() = expensiveCalculation()
inline per get/setter se contiene parametri generici reified o espressioni lambda con cross-linking.Best practices: utilizzare l'accessore inline solo per espressioni molto brevi e frequentemente chiamate senza effetti collaterali.
Se si aggiunge un'annotazione con riflessione a una proprietà con getter/setter inline, funzionerà inline?
Risposta: No. Se la proprietà viene utilizzata tramite l'API di riflessione o fa riferimento a KProperty, il compilatore non sarà in grado di incorporare il getter/setter, e rimarranno normali metodi. L'inlining avviene solo con accesso diretto nel codice.
Storia
Perdita di prestazioni a causa del lavoro della riflessione con getter inline:
Abbiamo riscritto una proprietà calda su getter inline, sperando di eliminarne le chiamate aggiuntive. Successivamente, abbiamo aggiunto la validazione tramite KProperty — alla fine, le chiamate sono avvenute tramite riflessione, annullando completamente il vantaggio dell'accessore inline.
Storia
Effetti collaterali indesiderati durante l'inlining:
Il getter inline eseguiva il logging:
inline get() { println("accessed!") return field }
Tale implementazione portava a una registrazione inaspettata in molti posti, quando la proprietà veniva letta frequentemente in diverse parti del codice, causando un notevole ingombro nei log.
Storia
Rottura ABI a causa della modifica della proprietà inline:
Abbiamo cambiato la logica del getter inline nella libreria, senza ricompilare i moduli dipendenti, i client hanno continuato a utilizzare la vecchia firma — l'ABI esteso più l'inlining ha portato a incompatibilità e a fallimenti silenziosi dei client durante l'aggiornamento.