Kotlin ermöglicht es, Getter und Setter von Eigenschaften mit dem Modifikator inline zu kennzeichnen. Dies gibt dem Compiler das Recht, den Code des Accessors direkt an den Aufrufstellen zur Leistungsoptimierung einzufügen.
Beispiel:
val foo: Int inline get() = expensiveCalculation()
inline kann nicht für Getter/Setter verwendet werden, die reified generische Parameter oder lambdas mit Cross-Linking enthalten.Best Practices: Verwenden Sie Inline-Accessoren nur für sehr kurze, häufig aufgerufene Ausdrücke ohne Nebenwirkungen.
Wenn man einer Eigenschaft mit einem Inline-Getter/Setter eine Annotation mit Reflexion hinzufügt (z.B. sie über KProperty verwendet), wird Inline funktionieren?
Antwort: Nein. Wenn eine Eigenschaft über die Reflection-API verwendet wird oder auf KProperty verweist, kann der Compiler den Getter/Setter nicht einfügen, und sie bleiben normale Methoden. Inline geschieht nur bei direkter Ansprache im Code.
Geschichte
Leistungsverlust durch Reflexion bei Inline-Getter:
Wir haben eine heiße Eigenschaft auf einen Inline-Getter umgeschrieben, in der Hoffnung, überflüssige Aufrufe zu vermeiden. Später haben wir eine Validierung über KProperty hinzugefügt – die Aufrufe erfolgten dann durch Reflexion, was den Vorteil des Inline-Accessors vollständig negierte.
Geschichte
Unerwünschte Nebenwirkungen bei Inlining:
Der Inline-Getter führte Protokollierungen durch:
inline get() { println("accessed!") return field }
Diese Implementierung führte zu unerwarteten Protokolleinträgen an vielen Stellen, da die Eigenschaft häufig an verschiedenen Stellen im Code gelesen wurde, was die Protokolle stark überlastete.
Geschichte
ABI-Brechen durch Änderung von Inline-Eigenschaften:
Die Logik des Inline-Getters in der Bibliothek wurde geändert, ohne die abhängigen Module neu zu kompilieren, die Kunden verwendeten weiterhin die alte Signatur – das erweiterte ABI plus Inlining führte zu Inkompatibilität und verstecktem Absturz der Kunden beim Update.