En caso de que no lo sepa, Project Lombok ayuda con algunas de las molestias de Java con cosas como generar captadores y establecedores con anotaciones e incluso generación simple como JavaBean con @Data . Realmente podría ayudarme, especialmente en 50 objetos de eventos diferentes donde tienes hasta 7 campos diferentes que deben construirse y ocultarse con captadores. Podría eliminar casi mil líneas de código con esto.
Sin embargo, me preocupa que a la larga sea una decisión lamentable. Flamewars entrará en erupción en el ##Java Freenode
canal cuando lo mencione, proporcionar fragmentos de código confundirá a los posibles ayudantes, la gente se quejará de la falta de JavaDoc y los futuros comisionados podrían eliminarlo de todos modos. Realmente disfrutaría lo positivo, pero me preocupa lo negativo.
Entonces: ¿Es seguro usar Lombok en cualquier proyecto, pequeño o grande? ¿Los efectos positivos valen los negativos?
javac
para abrir el acceso a lassun.*
clases internas ((Respuestas:
Parece que ya ha decidido que el Proyecto Lombok le brinda importantes ventajas técnicas para su nuevo proyecto propuesto. (Para ser claros desde el principio, no tengo puntos de vista particulares sobre el Proyecto Lombok, de una forma u otra).
Antes de usar el Proyecto Lombok (o cualquier otra tecnología que cambie el juego) en algún proyecto (de código abierto u otro), debe asegurarse de que los interesados en el proyecto estén de acuerdo con esto. Esto incluye a los desarrolladores y cualquier usuario importante (por ejemplo, patrocinadores formales o informales).
Usted menciona estos posibles problemas:
Fácil. Ignora / no participes en los flamewars, o simplemente abstente de mencionar a Lombok.
Si la estrategia del proyecto es utilizar Lombok, entonces los posibles ayudantes deberán acostumbrarse.
Ese es su problema. Nadie en su sano juicio intenta aplicar rígidamente las reglas de código fuente / documentación de su organización al software de código abierto de terceros. El equipo del proyecto debe ser libre de establecer estándares de código fuente / documentación del proyecto que sean apropiados para la tecnología que se utiliza.
( SEGUIMIENTO : los desarrolladores de Lombok reconocen que no generar comentarios de javadoc para los métodos sintetizadores getter y setter es un problema. Si este es un problema importante para sus proyectos, entonces una alternativa es crear y enviar un parche de Lombok para solucionarlo. )
Eso no está encendido! Si la estrategia del proyecto acordada es usar Lombok, entonces los comisionados que des-liberan el código de forma gratuita deben ser castigados y, si es necesario, se les deben retirar sus derechos de compromiso.
Por supuesto, esto supone que tiene el compromiso de las partes interesadas ... incluidos los desarrolladores. Y supone que está preparado para discutir su causa y manejar adecuadamente las inevitables voces disidentes.
fuente
getCreationDate
,getDueDate
. Nombrar triunfos comentarios donde sea posible.Acabo de empezar a usar Lombok hoy. Hasta ahora me gusta, pero un inconveniente que no vi mencionado fue la refactorización del soporte.
Si tiene una clase anotada con
@Data
, generará los captadores y establecedores para usted en función de los nombres de campo. Si usa uno de esos captadores en otra clase, luego decida que el campo tiene un nombre incorrecto, no encontrará usos de esos captadores y establecedores y reemplazará el nombre antiguo con el nuevo nombre.Me imagino que esto debería hacerse a través de un complemento IDE y no a través de Lombok.
ACTUALIZACIÓN (22 de enero de 13)
Después de usar Lombok durante 3 meses, todavía lo recomiendo para la mayoría de los proyectos. Sin embargo, encontré otro inconveniente que es similar al mencionado anteriormente.
Si tiene una clase, digamos
MyCompoundObject.java
que tiene 2 miembros, ambos anotados con@Delegate
, digamosmyWidgets
ymyGadgets
, cuando llamamyCompoundObject.getThingies()
desde otra clase, es imposible saber si está delegando alWidget
oGadget
porque ya no puede saltar a la fuente dentro del IDE.Usar el "Generar métodos de delegado ..." de Eclipse le proporciona la misma funcionalidad, es igual de rápido y proporciona un salto de origen. La desventaja es que satura tu fuente con código repetitivo que quita el foco de las cosas importantes.
ACTUALIZACIÓN 2 (26 de febrero de 13)
Después de 5 meses, todavía estamos usando Lombok, pero tengo algunas otras molestias. La falta de un getter & setter declarado puede ser molesto a veces cuando intentas familiarizarte con el nuevo código.
Por ejemplo, si veo un método llamado
getDynamicCols()
pero no sé de qué se trata, tengo que superar algunos obstáculos adicionales para determinar el propósito de este método. Algunos de los obstáculos son Lombok, otros son la falta de un complemento inteligente de Lombok. Los obstáculos incluyen:Outline
vista, por lo que no vi los métodos. Falta de búsqueda de referencias. Si quiero ver quién llamagetDynamicCols(args...)
, tengo que generar o codificar el setter para poder buscar referencias.ACTUALIZACIÓN 3 (7 de marzo de 13)
Supongo que aprender a usar las diversas formas de hacer las cosas en Eclipse. En realidad, puede establecer un punto de interrupción condicional (BP) en un método generado por Lombok. Con la
Outline
vista, puede hacer clic con el botón derecho en el métodoToggle Method Breakpoint
. Luego, cuando golpee el BP, puede usar laVariables
vista de depuración para ver cómo el método generado nombró los parámetros (generalmente el mismo que el nombre del campo) y finalmente, usar laBreakpoints
vista para hacer clic derecho en el BP y seleccionarBreakpoint Properties...
para agregar una condición. Agradable.ACTUALIZACIÓN 4 (16 de agosto de 13) A
Netbeans no le gusta cuando actualiza sus dependencias de Lombok en su pompón Maven. El proyecto aún se compila, pero los archivos se marcan por tener errores de compilación porque no puede ver los métodos que Lombok está creando. Borrar el caché de Netbeans resuelve el problema. No estoy seguro si hay una opción de "Proyecto limpio" como la hay en Eclipse. Problema menor, pero quería darlo a conocer.
ACTUALIZACIÓN 5 (17 de enero de 14)
Lombok no siempre juega bien con Groovy, o al menos con el
groovy-eclipse-compiler
. Es posible que deba degradar su versión del compilador. Maven Groovy y Java + LombokACTUALIZACIÓN 6 (26 de junio de 2014)
Una palabra de advertencia. Lombok es un poco adictivo y si trabajas en un proyecto en el que no puedes usarlo por alguna razón, te molestará. Puede que sea mejor que nunca lo uses.
ACTUALIZACIÓN 7 (23 de julio de 14)
Esta es una actualización un poco interesante porque aborda directamente la seguridad de adoptar Lombok sobre la que el OP preguntó.
A partir de v1.14, la
@Delegate
anotación se ha degradado a un estado Experimental. Los detalles están documentados en su sitio ( Lombok Delegate Docs ).La cuestión es que, si estaba usando esta función, sus opciones de retroceso son limitadas. Veo las opciones como:
@Delegate
anotaciones y genere / codifique manualmente el código delegado. Esto es un poco más difícil si estaba utilizando atributos dentro de la anotación.@Delegate
anotación y quizás vuelva a agregar las anotaciones que desee.Por lo que puedo decir, Delombok no tiene una opción para eliminar un subconjunto de anotaciones ; es todo o nada al menos para el contexto de un solo archivo. Abrí un ticket para solicitar esta función con las banderas de Delombok, pero no esperaría eso en el futuro cercano.
ACTUALIZACIÓN 8 (20 de octubre de 2014)
Si es una opción para usted, Groovy ofrece la mayoría de los mismos beneficios de Lombok, además de una gran cantidad de otras características, incluido @Delegate . Si usted cree que tendrá dificultades para vender la idea a los poderes fácticos, echar un vistazo a la
@CompileStatic
o@TypeChecked
anotación para ver si eso puede ayudar a su causa. De hecho, el enfoque principal de la versión Groovy 2.0 fue la seguridad estática .ACTUALIZACIÓN 9 (1 de septiembre de 2015)
Lombok aún se mantiene y mejora activamente , lo que es un buen augurio para el nivel de seguridad de la adopción. Las anotaciones de @Builder son una de mis nuevas funciones favoritas.
ACTUALIZACIÓN 10 (17 de noviembre de 2015)
Esto puede no parecer directamente relacionado con la pregunta del OP, pero vale la pena compartirlo. Si está buscando herramientas que lo ayuden a reducir la cantidad de código repetitivo que escribe, también puede consultar Google Auto , en particular AutoValue . Si nos fijamos en su plataforma de diapositivas , la lista de Lombok como una posible solución al problema que están tratando de resolver. Los inconvenientes que enumeran para Lombok son:
No estoy seguro de cuánto estoy de acuerdo con su evaluación. Y dados los inconvenientes de AutoValue que están documentados en las diapositivas, me quedaré con Lombok (si Groovy no es una opción).
ACTUALIZACIÓN 11 (8 de febrero de 16)
Descubrí que Spring Roo tiene algunas anotaciones similares . Me sorprendió un poco descubrir que Roo sigue siendo una cosa y encontrar documentación para las anotaciones es un poco difícil. La eliminación tampoco parece tan fácil como de-lombok. Lombok parece ser la opción más segura.
ACTUALIZACIÓN 12 (17 de febrero de 16)
Mientras trataba de encontrar justificaciones de por qué es seguro traer a Lombok para el proyecto en el que estoy trabajando actualmente, encontré una pieza de oro que se agregó con
v1.14
- El sistema de configuración ! Esto significa que puede configurar un proyecto para deshabilitar ciertas funciones que su equipo considera inseguras o indeseables. Mejor aún, también puede crear configuraciones específicas de directorio con diferentes configuraciones. Esto es IMPRESIONANTE.ACTUALIZACIÓN 13 (4 de octubre de 16)
Si este tipo de cosas son importantes para usted, Oliver Gierke sintió que era seguro agregar Lombok a Spring Data Rest .
ACTUALIZACIÓN 14 (26 de septiembre de 17)
Como señaló @gavenkoa en los comentarios sobre la pregunta de los OP, el soporte del compilador JDK9 aún no está disponible (Número 985). También parece que no será una solución fácil para el equipo de Lombok.
ACTUALIZACIÓN 15 (26 de marzo de 18)
El registro de cambios de Lombok indica a partir de v1.16.20 " Compilar lombok en JDK1.9 ahora es posible " a pesar de que el # 985 todavía está abierto.
Sin embargo, los cambios para acomodar JDK9 requirieron algunos cambios importantes; todo aislado a los cambios en los valores predeterminados de configuración. Es un poco preocupante que introdujeron cambios importantes, pero la versión solo superó el número de versión "Incremental" (pasando de v1.16.18 a v1.16.20). Dado que esta publicación fue sobre la seguridad, si tuviera un
yarn/npm
sistema de compilación similar que se actualizara automáticamente a la última versión incremental, es posible que se encuentre con un rudo despertar.ACTUALIZACIÓN 16 (9 de enero de 19)
Parece que los problemas de JDK9 se han resuelto y Lombok funciona con JDK10, e incluso JDK11 hasta donde puedo decir.
Sin embargo, una cosa que noté que era preocupante por un aspecto de seguridad es el hecho de que el registro de cambios que va de v1.18.2 a v1.18.4 enumera dos elementos como
BREAKING CHANGE
! No estoy seguro de cómo ocurre un cambio importante en una actualización de "parche" de semver. Podría ser un problema si usa una herramienta que actualiza automáticamente las versiones de parches.fuente
UPDATE 6
se siente mucho como Scala :)Siga adelante y use Lombok, puede, si es necesario, "delombok" su código después http://projectlombok.org/features/delombok.html
fuente
Personalmente (y por lo tanto subjetivamente) descubrí que el uso de Lombok hace que mi código sea más expresivo sobre lo que estoy tratando de lograr en comparación con las implementaciones IDE / propias de métodos complejos como hashcode & equals.
Cuando usas
es mucho más fácil mantener la coherencia de Equals & HashCode y realizar un seguimiento de los campos evaluados que cualquier implementación IDE / propia. Esto es especialmente cierto cuando todavía está agregando / eliminando campos regularmente.
Lo mismo ocurre con la
@ToString
anotación y sus parámetros que comunican claramente el comportamiento deseado con respecto a los campos incluidos / excluidos, el uso de captadores o el acceso al campo y si se debe llamar o nosuper.toString()
.Y nuevamente, al anotar una clase completa con
@Getter
o@Setter(AccessLevel.NONE)
(y opcionalmente anular cualquier método divergente), queda claro de inmediato qué métodos estarán disponibles para los campos.Los beneficios siguen y siguen.
En mi opinión, no se trata de reducir el código, sino de comunicar claramente lo que desea lograr, en lugar de tener que resolverlo a partir de Javadoc o implementaciones. El código reducido hace que sea más fácil detectar implementaciones de métodos divergentes.
fuente
Lombok es genial, pero ...
Lombok rompe las reglas del procesamiento de anotaciones, ya que no genera nuevos archivos fuente. Esto significa que no se puede usar con otros procesadores de anotaciones si esperan que existan getters / setters o cualquier otra cosa.
El procesamiento de anotaciones se ejecuta en una serie de rondas. En cada ronda, cada uno tiene un turno para correr. Si se encuentran nuevos archivos java después de completar la ronda, comienza otra ronda. De esta manera, el orden de los procesadores de anotaciones no importa si solo generan nuevos archivos. Como lombok no genera ningún archivo nuevo, no se inician nuevas rondas, por lo que algunos AP que se basan en el código de lombok no se ejecutan como se esperaba. Esto fue una gran fuente de dolor para mí al usar Mapstruct, y la eliminación de la fusión no es una opción útil, ya que destruye los números de línea en los registros.
Eventualmente pirateé un script de compilación para trabajar con lombok y mapstruct. Pero quiero abandonar lombok debido a lo hacky que es, al menos en este proyecto. Yo uso lombok todo el tiempo en otras cosas.
fuente
Leí algunas opiniones sobre el Lombok y en realidad lo estoy usando en algunos proyectos.
Bueno, en el primer contacto con Lombok tuve una mala impresión. Después de algunas semanas, me empezó a gustar. Pero después de algunos meses descubrí muchos pequeños problemas al usarlo. Entonces, mi impresión final sobre Lombok no es tan positiva.
Mis razones para pensar de esta manera:
@Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor
bloques de anotaciones sin pensar en qué métodos la clase realmente necesita exponerse.@Builder
lugar de un constructor o un método de constructor estático. A veces incluso intentan crear un generador dentro del generador de lombok, creando situaciones extrañas comoMyClass.builder().name("Name").build().create()
.@AllArgsConstructor
necesita agregar un parámetro más en el constructor, el IDE no puede ayudarlo a agregar este parámetro adicional en todos los lugares (principalmente, pruebas) que están instanciando la clase.Como dijo otra respuesta, si estás enojado por la verbosidad de Java y usas Lombok para lidiar con eso, prueba Kotlin.
fuente
También existen riesgos de mantenimiento a largo plazo. Primero, recomendaría leer sobre cómo funciona realmente Lombok, por ejemplo, algunas respuestas de sus desarrolladores aquí .
El sitio oficial también contiene una lista de inconvenientes , incluida esta cita de Reinier Zwitserloot:
En resumen, si bien Lombok puede ahorrarle algo de tiempo de desarrollo, si hay una actualización de javac no compatible con versiones anteriores (por ejemplo, una mitigación de vulnerabilidad), Lombok podría quedarse con una versión anterior de Java mientras los desarrolladores se esfuerzan por actualizar su uso de esos API internas. Si esto es un riesgo grave obviamente depende del proyecto.
fuente
Sé que llego tarde, pero no puedo resistir la tentación: cualquiera a quien le guste Lombok también debería echar un vistazo a Scala. Muchas buenas ideas que encuentras en Lombok son parte del lenguaje Scala.
Sobre su pregunta: definitivamente es más fácil hacer que sus desarrolladores prueben Lombok que Scala. Pruébalo y si les gusta, prueba Scala.
Solo como descargo de responsabilidad: ¡también me gusta Java!
fuente
He usado Lombok en casi todos mis proyectos durante un año, pero desafortunadamente lo eliminé. Al principio, era una forma de desarrollo muy limpia, pero configurar el entorno de desarrollo para los nuevos miembros del equipo no es muy fácil y directo. Cuando se convirtió en un dolor de cabeza, simplemente lo eliminé. Pero es un buen trabajo y necesita algo más de simplicidad para la configuración.
fuente
Cuando le mostré el proyecto a mi equipo, el entusiasmo era alto, así que creo que no debes temer la respuesta del equipo.
En cuanto al ROI, es fácil de integrar y no requiere ningún cambio de código en su forma básica. (solo agrega una anotación a tu clase)
Y por último, si cambia de opinión, puede ejecutar el unlombok o dejar que su IDE cree estos iniciadores, captadores y controladores (lo que creo que nadie solicitará una vez que vean cuán claro se vuelve su pojo)
fuente
Mi opinión sobre Lombok es que simplemente proporciona accesos directos para escribir código Java de placa de identificación.
Cuando se trata de usar accesos directos para escribir código Java de placa de identificación, me basaría en tales características proporcionadas por IDE; como en Eclipse, podemos ir al menú Fuente> Generar captadores y establecedores para generar captadores y establecedores.
No confiaría en una biblioteca como Lombok para esto:
@Getter
,@Setter
etc. anotaciones). En lugar de aprender una sintaxis alternativa para Java, cambiaría a cualquier otro lenguaje que proporcione de forma nativa la sintaxis similar a Lombok.En general, no preferiría "condimentar" mi Java con Lombok.
fuente
Quería usar lombok's
@ToString
pero pronto enfrentó errores de compilación aleatorios en la reconstrucción del proyecto en Intellij IDEA. Tuve que presionar la compilación varias veces antes de que la compilación incremental pudiera completarse con éxito.Intenté tanto lombok 1.12.2 como 0.9.3 con Intellij IDEA 12.1.6 y 13.0 sin ningún complemento de lombok en jdk 1.6.0_39 y 1.6.0_45.
Tuve que copiar manualmente los métodos generados desde la fuente delomboked y poner lombok en espera hasta tiempos mejores.
Actualizar
El problema ocurre solo con la compilación paralela habilitada.
Presentado un problema: https://github.com/rzwitserloot/lombok/issues/648
Actualizar
Actualizar
Recomiendo encarecidamente cambiar de Java + Lombok a Kotlin si es posible. Como ha resuelto desde cero todos los problemas de Java que Lombok intenta solucionar.
fuente
Me he encontrado con un problema con Lombok y Jackson CSV , cuando clasifiqué mi objeto (Java Bean) en un archivo CSV, las columnas se duplicaron, luego eliminé la anotación @Data de Lombok y la clasificación funcionó bien.
fuente
No lo recomiendo Solía usarlo, pero luego, cuando trabajo con NetBeans 7.4, estaba confundiendo mis códigos. Tengo que eliminar lombok en todos los archivos en mis proyectos. Hay delombok, pero ¿cómo puedo estar seguro de que no estropeará mis códigos? Tengo que pasar días solo para eliminar lombok y volver a los estilos Java normales. Yo demasiado picante ...
fuente
Todavía no he intentado usar Lombok: es / fue el siguiente en mi lista, pero parece que Java 8 le ha causado problemas importantes, y el trabajo de recuperación todavía estaba en progreso desde hace una semana. Mi fuente para eso es https://code.google.com/p/projectlombok/issues/detail?id=451 .
fuente