Tengo un problema con el uso de palabras clave reservadas de Java en Kotlin. Como no todas las palabras clave reservadas están disponibles en Kotlin, el compilador de Kotlin no puede (¿o no?) detectar las palabras clave reservadas que solo están en Java.
Por ejemplo, tome el ejemplo de default . Es una palabra clave reservada de Java. Eso significa que no puedes hacer lo siguiente.
public class UserJava { public String default; }Sin embargo, NO es una palabra clave reservada en Kotlin, por lo que puede usarla de la siguiente manera
class UserKotlin { var default: String? = null }Para alguien que no conoce Java, sería difícil saber que son palabras clave reservadas. Como el compilador de Kotlin no le da un error, ni ningún tipo de advertencia de que está usando una palabra clave reservada, puede causar algunos problemas más adelante, que no esperaría.
Uno de los problemas que puede encontrar es durante AnnotationProcessing , que son las bibliotecas que incluye en su gradle con kapt o annotationProcessor . Como Kotlin usa el compilador de Java cuando, por ejemplo, intenta obtener los campos de la clase UserKotlin , obtendrá una lista vacía ya que el compilador de Java NO "entiende" el campo default y lo ignora (¿lo salta?).
El ejemplo de la vida real sería si usa la biblioteca Room y tiene una entidad como la siguiente
@Entity class User{ @PrimaryKey var id: Int = 0 var default: String? = null }El procesador de anotaciones de habitaciones generará una consulta de creación de SQLite de
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`)) Entonces, básicamente omitió el campo default .
¿Hay alguna forma de que Kotlin avise cuando intento usar palabras clave reservadas de Java? ¿O es un error en Kotlin que aún no se ha solucionado? O hay alguna documentación que menciona este problema.
Si conozco Java, es posible que me muestre reticente a usar palabras clave, ya que sé que están reservadas en Java. Pero, ¿qué pasa si no sé Java y no puedo entender cuál es el problema?
Sinceramente, dudo que este sea un problema dentro de la JVM, pero con la biblioteca de anotaciones. Kotlin no expone la variable default ; lo que es público/expuesto son el getter y el setter. Dicho esto, tal vez la biblioteca de anotaciones esté tratando de acceder al campo privado directamente y termine sin encontrarlo porque es una palabra clave reservada y el compilador de Kotlin puede haberle dado un nombre diferente. ¿La biblioteca no da ninguna advertencia en tiempo de ejecución?
Dicho esto, kotlin planea extenderse a través de javascript/native, y con jvm convirtiéndose en solo parte de su imperio, no creo que tengan planes de agregar las advertencias sugeridas. Supongo que las bibliotecas tendrán que adaptarse a eso o perderán adeptos con el tiempo.
Android Lint ya tiene una regla opcional "No Hard Kotlin Keywords" que advierte cuando se usan palabras clave de Kotlin en código Java como identificadores, y su guía de interoperabilidad también advierte que no se usen estas palabras clave en código Java.
Lo mismo probablemente podría implementarse fácilmente al revés como una inspección en el propio complemento de Kotlin, idealmente desactivado de forma predeterminada porque la mayoría de las personas no lo necesitarán, pero aún así sería útil en algunos casos. Todavía no he encontrado un problema para esto en YouTrack , pero creo que sería razonable abrir uno.