Historia pytania:
W Kotlin dostęp do właściwości odbywa się za pomocą metod-getterów i setterów. Aby osiągnąć lepszą wydajność, deweloperzy dodali modyfikator inline do accessorów, który pozwala JVM optymalizować wywołania podczas kompilacji, wstawiając ciało get/set bezpośrednio do wywołującego kodu.
Problem:
Zwykłe metody accessorów są tworzone dla każdej właściwości, co zwiększa koszty wywołania (szczególnie przy częstym dostępie do nich). Czasami deweloperzy używają logiki w osobnym get/set, ale chcą uniknąć narzutu na wywołanie funkcji.
Rozwiązanie:
Użyj modyfikatora inline dla getterów lub setterów, jeśli ich implementacja jest krótka i nie zawiera ciężkiego kodu. Zmniejsza to narzut, szczególnie w hot-path. Zauważ — inlining działa tylko dla właściwości top-level oraz właściwości w obiektach-companion i object-owych, a nie w zwykłych klasach z powodu zasad dziedziczenia JVM.
Przykład kodu:
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)
Kluczowe cechy:
Czy można używać inline get/set z normalnymi właściwościami klas?
Nie, inlining dla getterów i setterów jest dozwolony tylko dla właściwości top-level lub object (w tym companion object), a nie dla właściwości w klasach, aby uniknąć problemów z dziedziczeniem.
Czy dostęp do backing field (pola wsparcia) jest dostępny w inline accessor?
Nie, inline accessor nie ma backing field, próba dostępu do niego spowoduje błąd kompilacji.
Czy inlining accessor zawsze wpływa na bytecode?
Inlining tylko sugeruje kompilatorowi możliwość wstawienia kodu. Kompilator JIT może to zignorować w niektórych przypadkach. Ponadto, jeśli accessor zawiera ciężką logikę, uzyskany efekt może być przeciwny.
W projekcie duża właściwość została ogłoszona inline, ale w getterze przetwarzają ciężką konwersję, używaną w pętli. Wynik – rozrosły bytecode, JIT wyłącza inlining, spada wydajność.
Zalety:
Wady:
Ogłosili inline val dla konwersji liczby na ciąg. Getter jest często wywoływany w kodzie UI. Wydajność pozostała wysoka, bytecode kompaktowy.
Zalety:
Wady: