Las funciones inline en Kotlin se definen con la palabra clave inline e instruyen al compilador a "sustituir" el cuerpo de la función directamente en los lugares de su llamada. Esto reduce el costo de la llamada a la función, especialmente cuando se utilizan lambdas o funciones cortas, y evita la asignación de objetos adicionales para capturar cierres.
Ejemplo:
def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }
Principales ventajas:
Desventajas:
Recomendación: Usa inline cuando necesites mejorar el rendimiento en secciones críticas del código donde se utilizan activamente lambdas.
¿Qué restricción existe para las funciones inline al trabajar con tipos de argumentos reified?
Respuesta incorrecta común: "Los tipos reified están siempre disponibles dentro de cualquier función inline."
Respuesta correcta: Solo las funciones inline pueden usar el modificador reified en la declaración de genéricos, lo que permite acceder al tipo en tiempo de ejecución:
inline fun <reified T> getTypeName() = T::class.java.name
En una función genérica normal, no habrá acceso al tipo T durante la ejecución.
Historia
Uso incorrecto de inline llevó a un APK inflado: En un equipo de proyecto de Android, los programadores marcaron decenas de funciones utilitarias como inline, incluyendo funciones con cuerpos grandes y complejos. Resultado: el tamaño del APK creció casi 2 MB debido a la duplicación de funciones en todos los lugares de llamada.
Historia
Error con lambdas y acceso a variables privadas: Se utilizó una función inline con una lambda, dentro de la cual se accedía a miembros privados de la clase. Después de mover la función a un módulo externo, el código dejó de compilar (privilegios violados), lo que solo se descubrió en CI.
Historia
Uso de reified fuera de la función inline: Uno de los desarrolladores intentó declarar una función con un parámetro genérico reified sin el modificador inline. El código no se compiló, lo que provocó una larga investigación por parte del novato sobre por qué "T::class" no está disponible fuera de las funciones inline.