Comecei a usar o Lombok hoje. Até agora, eu gostei, mas uma desvantagem que não vi mencionada foi a refatoração do suporte.
Se você tiver uma classe anotada @Data
, ela gerará os getters e setters para você com base nos nomes dos campos. Se você usar um desses getters em outra classe e decidir que o campo tem um nome incorreto, ele não encontrará usos desses getters e setters e substituirá o nome antigo pelo novo.
Eu imagino que isso teria que ser feito através de um plug-in IDE e não via Lombok.
ATUALIZAÇÃO (22 de janeiro de 13)
Depois de usar o Lombok por 3 meses, eu ainda o recomendo para a maioria dos projetos. No entanto, encontrei outra desvantagem semelhante à listada acima.
Se você tem uma turma, digamos MyCompoundObject.java
que tenha 2 membros, ambos anotados com @Delegate
, digamos myWidgets
e myGadgets
, quando você liga myCompoundObject.getThingies()
de outra turma, é impossível saber se está delegando Widget
ou Gadget
porque não é mais possível ir para a origem no IDE.
O uso do Eclipse "Gerar Métodos de Delegação ..." fornece a mesma funcionalidade, é tão rápido quanto fornece salto de origem. A desvantagem é que ela atrapalha sua fonte com um código padronizado que tira o foco das coisas importantes.
ATUALIZAÇÃO 2 (26 de fevereiro de 13)
Após 5 meses, ainda estamos usando o Lombok, mas tenho outros aborrecimentos. A falta de um getter & setter declarado pode ser irritante às vezes quando você está tentando se familiarizar com o novo código.
Por exemplo, se eu getDynamicCols()
vir um método chamado, mas não souber do que se trata, tenho alguns obstáculos extras a serem resolvidos para determinar o objetivo desse método. Alguns dos obstáculos são Lombok, outros são a falta de um plug-in inteligente Lombok. Os obstáculos incluem:
- Falta de JavaDocs. Se eu javadoc o campo, espero que o getter e o setter herdem esse javadoc através da etapa de compilação do Lombok.
- Ir para a definição de método me leva para a classe, mas não para a propriedade que gerou o getter. Este é um problema de plug-in.
- Obviamente, você não pode definir um ponto de interrupção em um getter / setter, a menos que gere ou codifique o método.
- NOTA: Esta pesquisa de referência não é um problema como eu pensava. Você precisa usar uma perspectiva que ative a exibição de estrutura de tópicos. Não é um problema para a maioria dos desenvolvedores. Meu problema era que eu estava usando o Mylyn, que estava filtrando minha
Outline
exibição, então não vi os métodos. Pesquisa de falta de referências. Se eu quiser ver quem está ligando getDynamicCols(args...)
, preciso gerar ou codificar o configurador para poder procurar referências.
ATUALIZAÇÃO 3 (7 de março de 13)
Acho que aprendi a usar as várias maneiras de fazer as coisas no Eclipse. Você pode realmente definir um ponto de interrupção condicional (BP) em um método gerado pelo Lombok. Usando a Outline
visualização, você pode clicar com o botão direito do mouse no método para Toggle Method Breakpoint
. Então, quando você atinge o BP, pode usar a Variables
visualização de depuração para ver como o método gerado nomeou os parâmetros (geralmente o mesmo que o nome do campo) e, finalmente, usar a Breakpoints
visualização para clicar com o botão direito do mouse no BP e selecionar Breakpoint Properties...
para adicionar uma condição. Agradável.
ATUALIZAÇÃO 4 (16 de agosto de 13) O
Netbeans não gosta quando você atualiza suas dependências do Lombok no seu pom do Maven. O projeto ainda é compilado, mas os arquivos são sinalizados por terem erros de compilação porque não podem ver os métodos que o Lombok está criando. Limpar o cache do Netbeans resolve o problema. Não tenho certeza se existe uma opção "Limpar projeto", como existe no Eclipse. Problema menor, mas queria torná-lo conhecido.
ATUALIZAÇÃO 5 (17 / jan / 14)
Lombok nem sempre é legal com Groovy, ou pelo menos com o groovy-eclipse-compiler
. Talvez você precise fazer o downgrade da sua versão do compilador.
Maven Groovy e Java + Lombok
ATUALIZAÇÃO 6 (26 de junho de 14)
Uma palavra de aviso. Lombok é um pouco viciante e se você trabalha em um projeto em que não pode usá-lo por algum motivo, isso o irritará. Você pode estar melhor só de nunca usá-lo.
ATUALIZAÇÃO 7 (23 de julho de 14)
Esta é uma atualização um pouco interessante, pois aborda diretamente a segurança da adoção do Lombok que o OP perguntou.
A partir da v1.14, a @Delegate
anotação foi rebaixada para um status Experimental. Os detalhes estão documentados em seu site ( Documentos do Delegado Lombok ).
O problema é que, se você estava usando esse recurso, suas opções de recuperação são limitadas. Vejo as opções como:
- Remova manualmente as
@Delegate
anotações e gere / codifique manualmente o código delegado. Isso é um pouco mais difícil se você estiver usando atributos na anotação.
- Descompacte os arquivos que possuem a
@Delegate
anotação e talvez adicione novamente as anotações que você deseja.
- Nunca atualize o Lombok ou mantenha um garfo (ou convide com o uso de recursos experimentais).
- Delombok todo o seu projeto e pare de usar Lombok.
Pelo que sei, Delombok não tem uma opção para remover um subconjunto de anotações ; é tudo ou nada pelo menos para o contexto de um único arquivo. Abri um ticket para solicitar esse recurso com sinalizadores Delombok, mas não esperaria isso no futuro próximo.
ATUALIZAÇÃO 8 (20 de outubro de 14)
Se for uma opção para você, o Groovy oferece a maioria dos mesmos benefícios do Lombok, além de uma carga de outros recursos, incluindo o @Delegate . Se você acha que vai ter dificuldade em vender a ideia para os poderes que existem, dê uma olhada na anotação @CompileStatic
ou @TypeChecked
para ver se isso pode ajudar sua causa. De fato, o foco principal da versão Groovy 2.0 era a segurança estática .
ATUALIZAÇÃO 9 (1º de setembro de 15) O
Lombok ainda está sendo mantido e aprimorado ativamente , o que é um bom presságio para o nível de segurança da adoção. As anotações do @Builder são um dos meus novos recursos favoritos.
ATUALIZAÇÃO 10 (17/11/15)
Isso pode não parecer diretamente relacionado à pergunta do OP, mas vale a pena compartilhar. Se você estiver procurando por ferramentas para ajudar a reduzir a quantidade de código padrão que você escreve, também pode conferir o Google Auto - em particular o AutoValue . Se você observar o deck de slides , a lista Lombok é uma possível solução para o problema que eles estão tentando resolver. Os contras que eles listam para Lombok são:
- O código inserido é invisível (você não pode "ver" os métodos que ele gera) [nota editada - na verdade você pode, mas requer apenas um descompilador]
- Os hacks do compilador não são padrão e são frágeis
- "Na nossa opinião, seu código não é mais realmente Java"
Não sei ao certo quanto concordo com a avaliação deles. E, considerando os contras do AutoValue que estão documentados nos slides, eu continuarei aderindo ao Lombok (se o Groovy não for uma opção).
ATUALIZAÇÃO 11 (8 de fevereiro de 16)
Descobri que o Spring Roo tem algumas anotações semelhantes . Fiquei um pouco surpreso ao descobrir que Roo ainda é uma coisa e encontrar documentação para as anotações é um pouco difícil. A remoção também não parece tão fácil quanto o de-lombok. Lombok parece ser a escolha mais segura.
ATUALIZAÇÃO 12 (17 de fevereiro de 1616)
Enquanto tentava apresentar justificativas sobre por que é seguro trazer Lombok para o projeto em que estou trabalhando, encontrei uma peça de ouro que foi adicionada com v1.14
- O sistema de configuração ! Isso significa que você pode configurar um projeto para desabilitar certos recursos que sua equipe considera inseguros ou indesejáveis. Melhor ainda, ele também pode criar configurações específicas de diretório com diferentes configurações. Isso é incrível.
ATUALIZAÇÃO 13 (4 de outubro de 16)
Se esse tipo de coisa importa para você, Oliver Gierke achou que era seguro adicionar Lombok ao Spring Data Rest .
ATUALIZAÇÃO 14 (26 de setembro de 17)
Como apontado por @gavenkoa nos comentários sobre a questão dos OPs, o suporte ao compilador JDK9 ainda não está disponível (edição nº 985). Também parece que não será uma solução fácil para a equipe de Lombok se locomover.
ATUALIZAÇÃO 15 (26 de março de 1818)
O registro de alterações do Lombok indica a partir da v1.16.20 " Compilar lombok no JDK1.9 agora é possível ", mesmo que o # 985 ainda esteja aberto.
As alterações para acomodar o JDK9, no entanto, exigiram algumas alterações recentes; tudo isolado para alterações nos padrões de configuração. É um pouco preocupante que eles tenham introduzido mudanças de última hora, mas a versão apenas aumentou o número da versão "Incremental" (passando da v1.16.18 para a v1.16.20). Como esta postagem tratava da segurança, se você tivesse um yarn/npm
sistema de compilação semelhante que atualizasse automaticamente para a versão incremental mais recente, você pode ter um despertar rude.
ATUALIZAÇÃO 16 (9 / jan / 19)
Parece que os problemas do JDK9 foram resolvidos e o Lombok trabalha com o JDK10 e até o JDK11, tanto quanto eu sei.
Uma coisa que notei, no entanto, era preocupante do ponto de vista da segurança: o fato de o registro de alterações passar da v1.18.2 para a v1.18.4 lista dois itens como BREAKING CHANGE
!? Não sei ao certo como acontece uma alteração de quebra em uma atualização de "patch" semver. Pode ser um problema se você usar uma ferramenta que atualize automaticamente as versões do patch.
javac
para abrir o acesso asun.*
classes internas ((