Notas de Kotlin / Java: están aquí

Recientemente, tuve una conversación interesante con un colega sobre el uso de comentarios en código Java / Kotlin. Trabajó en organizaciones que desaconsejaban el uso de ciertas características del lenguaje (en este caso, metaprogramación a través de anotaciones) porque estas características eran "demasiado mágicas" e "incomprensibles". Aunque es razonable elegir evitar el uso de ciertas características de frameworks o lenguajes porque generalmente se consideran dañinos, la "magia" de un desarrollador es una herramienta de productividad diaria para otro desarrollador.

Reiteraré mi oposición a la "magia" de otra manera:

No entiendo esta característica del lenguaje, por lo que decidí no usarla independientemente de su uso previsto o posibles ganancias de productividad.

Como desarrolladores, nuestro trabajo es comprender cuándo y cómo usar nuestras herramientas existentes para resolver los problemas que resolvemos con el software. Por lo tanto, mantener una mente abierta para aprovechar las características del lenguaje y el marco que utilizamos puede aumentar considerablemente la productividad. Este artículo presenta algunas aplicaciones de anotaciones en Kotlin y Java, y propone algunas formas de clasificar las anotaciones que ve para poder inferir su uso previsto.

¿Para qué son las anotaciones?

En un nivel superior, los comentarios proporcionan al compilador información sobre el código que se está compilando para que el programador pueda cambiar su comportamiento (es por eso que usamos el término "metaprogramación") o proporcionar información sobre lo que se ejecuta en tiempo de ejecución Información sobre el código. Cuando se usa junto con un procesador de comentarios (que se ejecuta en tiempo de compilación), ciertos comentarios se pueden usar para generar errores de compilación o advertencias, e incluso generar más código para que el compilador compile.

Por lo tanto, el atributo de la anotación solo puede ser otras anotaciones o valores (primitivas, cadenas, primitivas / matrices de cadenas, clases).

¿Qué beneficio genérico proporcionan las anotaciones?

Usando anotaciones, puede escribir código más conciso y claro, y no es muy propenso a errores. También pueden mejorar la legibilidad del código al indicarle al desarrollador cómo se debe usar el código.

¿Cómo se usan las anotaciones?

Hasta donde sé, su uso se puede dividir en las siguientes tres categorías (uso mi propia terminología):

  • Marca (BINARIO / CLASE) concentrador (tiempo de ejecución) generador (fuente)

Marcadores

Las marcas no son muy sexys, pero siguen siendo importantes. Pueden informar al lector (código) de la naturaleza del elemento del lenguaje anotado (como clase, tipo, campo / atributo, etc.), o pueden informar a la herramienta de análisis estático o al compilador del elemento anotado. Siempre se incluyen en el archivo de clase (esta es la enumeración de política de retención / binario de retención de anotaciones) para publicar su uso junto con los archivos jar creados por el código.

La marca ha quedado en desuso en Java y se usa para decirles a los desarrolladores que el Elemento está a punto de desaparecer, y escribir cualquier código nuevo que consuma el Elemento puede agregar más trabajo para usted en el futuro porque se verá obligado a migrar (generalmente en el principal Actualización de versión). Algunos IDE usan esta anotación para indicar a los usuarios que el elemento ha quedado en desuso. @Ha quedado obsoleto Las funciones de Kotlin se han mejorado para permitir a los desarrolladores proporcionar @ 用. . . Para reemplazar al miembro, el miembro permitirá que algunos IDEs (IntelliJ / Android Studio) reemplacen de manera inteligente el código en desuso con el código en desuso. Pero en la mayoría de los casos, esta es una herramienta para lectores de código.

Otra anotación útil de marcador en Java (aunque tenga RetentionPolicy.RUNTIME) es @Nonnull(que es parte del resultado de JSR-305 ). Si usa la implementación de Google, esta anotación resulta útil en la interoperabilidad de Java / Kotlin porque su código de Kotlin podrá decir que @Nonnull String fooestá Stringen Kotlin y no String?. Esto también ayuda en las herramientas de análisis estático (como findbugs) para que se puedan omitir las comprobaciones nulas. En caso de que te lo estés preguntando, esta anotación tiene un compañero @Nullable.

Enriquecedores

Los enriquecedores agregan información a un elemento del lenguaje que se puede leer durante el tiempo de ejecución (por lo tanto, estas anotaciones tienen AnnotationRetention.RUNTIMË/ RetentionPolicy.RUNTIMË). Digamos, por ejemplo, que estaba desarrollando una biblioteca personalizada de serialización / deserialización XML con la intención de evitar que sus consumidores necesiten escribir clases personalizadas de serializador / deserializador. Luego, podría usar un pequeño conjunto de anotaciones combinadas con un único serializador / deserializador que lea la información contenida dentro de las anotaciones en el (los) Elemento (s) de las clases que se pretende serializar hacia / desde. Hay una biblioteca que hace esto: http://simple.sourceforge.net/ .

Mi biblioteca favorita personal que aprovecha las anotaciones de tiempo de ejecución es (Retrofit2) [ https://square.github.io/retrofit/ ]. Retrofit2 utiliza la reflexión para generar objetos Proxy Java capaces de realizar una llamada de red basándose únicamente en la declaración de su método. Por ejemplo,

public interface UserService {
  @POST("users/new")
  Call<User> createUser(@Body User user);
}

Las anotaciones @POST y @ 体 se leen en tiempo de ejecución cuando se realiza la llamada, y cuando se ejecuta esta llamada, la actualización ensamblará una URL que corresponde al punto final en la anotación @POST y creará una solicitud OkHttp que tiene alguna forma serializada de El usuario solicita el objeto en el cuerpo. (Si no sabe cómo configurar la actualización para realizar esta operación, se recomienda leer la documentación).

Eso es genial, ¿verdad? En particular, en Android, AnnotationRetention.RUNŤIME/ RetentionPolicy.RUNŤIMEanotaciones tienen un costo: https://blog.nimbledroid.com/2016/02/23/slow-Android-reflection.html . Entonces, antes de volverse loco usándolos para todo, al menos en un proyecto de Android, tenga en cuenta los costos involucrados.

Generadores

Tanto Kotlin como Java tienen funciones de procesamiento de anotaciones. Los procesadores de anotaciones se ejecutan cuando se compila el proyecto (por lo tanto, pueden retener fuentes / retener fuentes de políticas a través de anotaciones). Lo que pueden hacer es simple, como agregar comentarios a la salida del registro en la consola, o cosas complicadas, como generar código para compilar. El generador es particularmente adecuado para casos en los que el patrón de reutilización tradicional falla y es útil para eliminar el código repetitivo.

Por ejemplo, si alguna vez ha implementado un patrón de construcción para hacer que las instancias de clases con muchos campos sean más fáciles de entender y se expliquen por sí mismas, es posible que esté familiarizado con la plantilla asociada con ellas. Te encontrarás a menudo pasando por el proceso de copiar-pegar-cambiar. Después de repetir este proceso 10 o 20 veces, es posible que haya cometido un error en alguna parte. Luego, para escribir métodos razonables de igual, hashCode y toString, tendrá que repetir ese flujo tres veces más. También tendrá que escribir un constructor que entienda cómo aplicar el constructor para construir su objeto sin asignar accidentalmente el error campo generador al campo de clase incorrecto.

Ingrese al increíble procesador de anotaciones AutoValue de Google: https://github.com/google/auto/blob/master/value/userguide/builders.md . Esta herramienta le permite declarar una versión abstracta de su clase y una versión abstracta del constructor para la clase, delegando los detalles de implementación al procesador de anotaciones. Adicionalmente, las equals, hashCodey toStringtambién se generan, los métodos y el constructor de la clase.

Supongamos que ahora debe agregar un campo a esta clase. No se preocupe por mantener la implementación del constructor, igual a, hashCode y hasta el último método toString`, solo necesita declarar un método abstracto para la clase y su constructor. La próxima vez que se compila el código, se actualizará la implementación real.

Pero esto no es todo. AutoValue está diseñado para ser extensible, y se introducen muchas extensiones de AutoValue para aumentar su productividad.

La serialización es una extensión natural de AutoValue, y algunas extensiones generan serializadores / deserializadores de los objetos de las clases que genera AutoValue. Destacaré auto-value-moshi en este artículo como una biblioteca representativa porque hay un procesador de anotación Kotlin adicional llamado moshi-codegen que operará y generará clases Kotlin para serializar / deserializar sus objetos Kotlin a / desde JSON.

Conclusión

Es importante comprender cómo aplicar las herramientas disponibles para resolver los problemas que enfrentan los desarrolladores de software. En lugar de evitar el uso de ciertas herramientas "mágicas", también debes aprender algo para hacerlas misteriosas.

Las anotaciones son una herramienta útil que puede aumentar su productividad en Kotlin / Java y mejorar la calidad del código cuando se usa adecuadamente. Así que la próxima vez que veas algunos Java / Kotlin tiene @, espero que entiendas mejor

de: https://dev.to//ryansgot/kotlin-java-annotations-they-re-where-it-s-anl

Publicado 0 artículos originales · me gusta 0 · visitas 407

Supongo que te gusta

Origin blog.csdn.net/cunxiedian8614/article/details/105690090
Recomendado
Clasificación