Una de las grandes maravillas de Kotlin es que está totalmente integrado con Java. Esto quiere decir que aunque todo el código de tu aplicación sea Java, puedes crearte una clase en Kotlin y utilizarla desde Java sin problema.

Esto te da potencialmente dos ventajas:

  • Puedes usar Kotlin en un proyecto Java: en cualquier proyecto que tengas ya empezado, puedes decidir empezar a hacer el código nuevo en Kotlin. Desde Java podrás acceder a él.
  • Si te bloqueas en Kotlin, puedes hacer esa parte en Java: mucha gente me pregunta si hay algún caso en el que Kotlin no será suficiente para hacer algo en Android. Teóricamente todo se puede, pero en la práctica no hay forma de saberlo (nadie lo ha hecho “todo” en Android con Kotlin). El caso es que no importa, si no consigues hacerlo en Kotlin, puedes implementar esa parte en Java.

Hoy vamos a ver cómo funciona esta compatibilidad, y qué pinta tiene el código de Kotlin en Java.

Este artículo forma parte de una serie de 30 con motivo del lanzamiento del curso presencial Kotlin para desarrolladores Android, que se celebrará muy pronto. ¡Aún puedes apuntarte!

kotlin-desarrolladores-android

Funciones a nivel de paquete

En Kotlin, las funciones no necesitan estar dentro de una clase, pero esto no ocurre así en Java. ¿Cómo podemos llamar a una función entonces? Imaginemos que tenemos un fichero utils.kt con la siguiente pinta:

En Java podremos acceder a ellos mediante una clase que llamará UtilsKt, con métodos estáticos:

Ya has visto por artículos anteriores que me encantan las funciones de extensión. ¿Qué pinta tienen en Java? Imaginemos que tenemos la siguiente:

Nota: aunque puede que hayan aparecido en algún momento, no lo he comentado explícitamente. Los argumentos de una función pueden tener valores por defecto. Esto significa que si no los especificamos, tomarán el valor que se indica en la declaración. Esto nos evita la sobrecarga de métodos que solemos utilizar en Java

La función se aplica sobre un ViewGroup. Recibe un layout y lo infla utilizando la vista padre.

¿Qué obtendríamos si lo queremos utilizar en Java?

Como ves, el objeto sobre el que se aplica se añade como argumento de la función. Además, el argumento opcional se vuelve obligatorio, pues en Java no tenemos esa opción.

Si quieres que genere las sobrecargas en Java, puedes utilizar la anotación @JvmOverloads delante de la función. Esto nos permitiría no necesitar especificar el false en Java:

Si por lo que sea prefieres darle un nombre más característico a la clase que se mostrará en Java, puedes usar una anotación para modificarlo. En el fichero de utils.kt añade antes del package:

Y ahora la clase en Java se llamará así:

Campos de instancia y estáticos

En Java utilizamos campos para almacenar el estado. Pueden ser campos de instancia, lo que implica que cada clase tendrá los suyos, o estáticos (todos los comparten).

Si intentamos buscar un mapeo de esto en Kotlin, serían las propiedades y los companion objects. Si tenemos una clase así:

¿Cómo funcionará esto en Java? Simplemente puedes acceder a los objetos del companion como si fueran campos estáticos, y a las properties mediante getters y setters:

Y verás que el compilador no se queja. Al ser val, sólo nos genera el getter en Java. Si fuera var, también tendríamos un setter.

El acceso a instance ha funcionado automáticamente porque usa la anotación lateinit, que automáticamente expone el campo que Kotlin usa por detrás para almacenar el estado. Pero si por ejemplo usamos creamos una constante:

Verás que no puedes acceder a ella. Para exponer el campo, necesitarás una nueva anotación:

Y ahora ya puedes utilizarla desde código Java:

Si tuvieras funciones en un companion object, se convierten en métodos estáticos usando la anotación @JvmStatic.

Conclusión

Ya ves que es sencillísimo utilizar el código Kotlin en Java. Aquí te he mostrado algunos de los casos más típicos, pero todo se consigue de forma muy similar.

Espero que, si tenías alguna duda, esto te haya convencido a empezar a utilizar Kotlin en tus proyectos. Y si de verdad quieres ponerte en serio, te recomiendo que le eches un vistazo al curso de Kotlin para Desarrolladores Android.