Historia de la cuestión:
En Kotlin, el acceso a las propiedades se realiza a través de métodos getter y setter. Para lograr un mejor rendimiento, los desarrolladores añadieron el modificador inline para los accesores, lo que permite a la JVM optimizar las llamadas durante la compilación, insertando el cuerpo de get/set directamente en el código que llama.
Problema:
Los métodos accessor normales se crean para cada propiedad, lo que aumenta el costo de llamada (especialmente cuando se accede a ellos con frecuencia). A veces, los desarrolladores utilizan la lógica separada en un get/set, pero desean evitar la sobrecarga de la llamada a la función.
Solución:
Utilice el modificador inline en el getter o setter si su implementación es corta y no tiene código pesado. Esto reduce la sobrecarga, especialmente en el hot-path. Tenga en cuenta: el inlining solo funciona para propiedades de nivel superior y propiedades en objetos companion y objetos, y no en clases normales debido a los principios de herencia de la JVM.
Ejemplo de código:
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)
Características clave:
¿Se pueden usar getters/setters inline con propiedades de clases normales?
No, el inlining para getters y setters es permisible solo para propiedades de nivel superior o de objeto (incluyendo companion object), no para propiedades dentro de clases, para evitar problemas de herencia.
¿Está disponible el acceso al backing field en el accessor inline?
No, el accessor inline no tiene backing field, intentar acceder a él causará un error de compilación.
¿Siempre afecta el inlining del accessor al bytecode?
El inlining solo sugiere al compilador la posibilidad de incrustar el código. El compilador JIT puede ignora esto en algunos casos. Además, si el accessor contiene lógica pesada, el efecto resultante puede ser el opuesto.
En el proyecto, una propiedad grande fue declarada como inline, pero en el getter se realiza una conversión pesada, utilizada en un bucle. Como resultado, el bytecode final se infló, el JIT desactiva el inlining y la rendimiento cae.
Ventajas:
Desventajas:
Se declaró un val inline para convertir un número en una cadena. El getter se llama a menudo en el código de UI. El rendimiento se mantuvo alto, el bytecode compacto.
Ventajas:
Desventajas: