Ho appena iniziato a usare Lombok oggi. Finora mi piace, ma uno svantaggio che non ho visto menzionato era il supporto al refactoring.
Se hai una classe annotata con @Data
, genererà i getter e i setter per te in base ai nomi dei campi. Se usi uno di quei getter in un'altra classe, poi decidi che il campo ha un nome mediocre, non troverà gli usi di quei getter e setter e sostituirà il vecchio nome con il nuovo nome.
Immagino che questo dovrebbe essere fatto tramite un plug-in IDE e non tramite Lombok.
AGGIORNAMENTO (22 gennaio 13)
Dopo aver usato Lombok per 3 mesi, lo consiglio ancora per la maggior parte dei progetti. Tuttavia, ho trovato un altro svantaggio simile a quello sopra elencato.
Se si dispone di una classe, dire MyCompoundObject.java
che ha 2 membri, sia annotata con @Delegate
, diciamo myWidgets
e myGadgets
, quando si chiama myCompoundObject.getThingies()
da un'altra classe, è impossibile sapere se si tratta di delegare al Widget
o Gadget
perché non è più possibile saltare alla fonte all'interno dell'IDE.
L'uso di Eclipse "Genera metodi delegati ..." offre le stesse funzionalità, è altrettanto rapido e consente di saltare alla fonte. Il rovescio della medaglia è che ingombra la tua fonte con codice boilerplate che toglie l'attenzione alle cose importanti.
AGGIORNAMENTO 2 (26 febbraio 13)
Dopo 5 mesi stiamo ancora usando Lombok, ma ho altri fastidi. La mancanza di un getter e setter dichiarati può diventare fastidiosa a volte quando stai cercando di familiarizzare con il nuovo codice.
Ad esempio, se vedo un metodo chiamato getDynamicCols()
ma non so di cosa si tratta, ho alcuni ostacoli extra da saltare per determinare lo scopo di questo metodo. Alcuni degli ostacoli sono Lombok, alcuni sono la mancanza di un plug-in intelligente Lombok. Gli ostacoli includono:
- Mancanza di JavaDocs. Se avessi javadoc sul campo, spererei che il getter e il setter ereditassero quel javadoc attraverso la fase di compilazione di Lombok.
- Passa alla definizione del metodo mi porta alla classe, ma non alla proprietà che ha generato il getter. Questo è un problema con il plugin.
- Ovviamente non puoi impostare un breakpoint in un getter / setter a meno che non generi o codifichi il metodo.
- NOTA: questa ricerca di riferimento non è un problema come pensavo per la prima volta. Tuttavia, è necessario utilizzare una prospettiva che abiliti la vista Struttura. Non è un problema per la maggior parte degli sviluppatori. Il mio problema era che sto usando Mylyn che stava filtrando la mia
Outline
vista, quindi non ho visto i metodi. Ricerca mancanza di riferimenti. Se voglio vedere chi sta chiamando getDynamicCols(args...)
, devo generare o codificare il setter per poter cercare riferimenti.
AGGIORNAMENTO 3 (7 marzo 13)
Imparando a usare i vari modi di fare le cose in Eclipse, credo. Puoi effettivamente impostare un breakpoint condizionale (BP) su un metodo generato da Lombok. Utilizzando la Outline
vista, è possibile fare clic con il tasto destro del mouse sul metodo Toggle Method Breakpoint
. Quindi, quando si preme il BP, è possibile utilizzare la Variables
vista di debug per vedere come il metodo generato ha chiamato i parametri (di solito lo stesso nome del campo) e, infine, utilizzare la Breakpoints
vista per fare clic con il pulsante destro del mouse sul BP e selezionare Breakpoint Properties...
per aggiungere una condizione. Bello.
AGGIORNAMENTO 4 (16 agosto 13) A
Netbeans non piace quando aggiorni le tue dipendenze Lombok nel tuo pom Maven. Il progetto viene ancora compilato, ma i file vengono contrassegnati per errori di compilazione perché non sono in grado di vedere i metodi che Lombok sta creando. Svuotare la cache di Netbeans risolve il problema. Non sono sicuro se esiste un'opzione "Pulisci progetto" come in Eclipse. Problema minore, ma volevo farlo conoscere.
AGGIORNAMENTO 5 (17 gennaio 14)
Lombok non gioca sempre bene con Groovy, o almeno con groovy-eclipse-compiler
. Potrebbe essere necessario eseguire il downgrade della versione del compilatore.
Maven Groovy e Java + Lombok
AGGIORNAMENTO 6 (26 giugno 14)
Un avvertimento. Lombok è un po 'avvincente e se lavori su un progetto in cui non puoi usarlo per qualche motivo, ti infastidirà. Potresti stare meglio semplicemente non usarlo affatto.
AGGIORNAMENTO 7 (23 luglio 14)
Questo è un aggiornamento un po 'interessante perché riguarda direttamente la sicurezza dell'adozione di Lombok di cui l'OP ha chiesto.
A partire dalla versione 1.14, l' @Delegate
annotazione è stata ridotta a uno stato Sperimentale. I dettagli sono documentati sul loro sito ( Lombok Delegate Docs ).
Il fatto è che se si utilizzava questa funzione, le opzioni di backout sono limitate. Vedo le opzioni come:
- Rimuovere manualmente le
@Delegate
annotazioni e generare / codificare a mano il codice delegato. Questo è un po 'più difficile se stavi usando gli attributi all'interno dell'annotazione.
- Delombok i file che hanno l'
@Delegate
annotazione e forse possono essere aggiunti nuovamente nelle annotazioni desiderate.
- Non aggiornare mai Lombok o mantenere un fork (o vivere con l'utilizzo di funzionalità esperienziali).
- Delombok l'intero progetto e smetti di usare Lombok.
Per quanto ne so, Delombok non ha un'opzione per rimuovere un sottoinsieme di annotazioni ; è tutto o niente almeno per il contesto di un singolo file. Ho aperto un biglietto per richiedere questa funzione con le bandiere Delombok, ma non me lo sarei aspettato in un prossimo futuro.
AGGIORNAMENTO 8 (20 ottobre 14)
Se è un'opzione per te, Groovy offre la maggior parte degli stessi vantaggi di Lombok, oltre a un carico di altre funzionalità, tra cui @Delegate . Se pensi che avrai difficoltà a vendere l'idea ai poteri che sono, dai un'occhiata alle annotazioni @CompileStatic
o @TypeChecked
per vedere se ciò può aiutare la tua causa. In effetti, l'obiettivo principale della versione Groovy 2.0 era la sicurezza statica .
AGGIORNAMENTO 9 (1 settembre 15)
Lombok è ancora attivamente mantenuto e migliorato , il che fa ben sperare per il livello di sicurezza dell'adozione. Le annotazioni di @Builder sono una delle mie nuove funzionalità preferite.
AGGIORNAMENTO 10 (17 novembre 15)
Potrebbe non sembrare direttamente correlato alla domanda del PO, ma vale la pena condividerlo. Se stai cercando strumenti che ti aiutino a ridurre la quantità di codice della caldaia che scrivi, puoi anche consultare Google Auto , in particolare AutoValue . Se guardi il loro mazzo di diapositive , elenca Lombok come una possibile soluzione al problema che stanno cercando di risolvere. I contro che elencano per Lombok sono:
- Il codice inserito è invisibile (non puoi "vedere" i metodi che genera) [ndr: in realtà puoi, ma richiede solo un decompilatore]
- Gli hack del compilatore sono non standard e fragili
- "A nostro avviso, il tuo codice non è più realmente Java"
Non sono sicuro di quanto concordi con la loro valutazione. E visti i contro di AutoValue che sono documentati nelle diapositive, starò con Lombok (se Groovy non è un'opzione).
AGGIORNAMENTO 11 (8 febbraio 16)
Ho scoperto che Spring Roo ha annotazioni simili . Sono stato un po 'sorpreso di scoprire che Roo è ancora una cosa e trovare documentazione per le annotazioni è un po' approssimativo. Anche la rimozione non sembra facile come de-lombok. Lombok sembra la scelta più sicura.
AGGIORNAMENTO 12 (17 febbraio 16)
Mentre cercavo di fornire giustificazioni sul perché sia sicuro portare Lombok per il progetto al quale sto lavorando, ho trovato un pezzo d'oro che è stato aggiunto con v1.14
- The Configuration System ! Ciò significa che è possibile configurare un progetto in modo da non consentire determinate funzionalità che il team ritiene non sicure o indesiderabili. Meglio ancora, può anche creare una configurazione specifica della directory con impostazioni diverse. Questo è bellissimo.
AGGIORNAMENTO 13 (4 ottobre 16)
Se questo genere di cose è importante per te, Oliver Gierke ritiene sicuro aggiungere Lombok a Spring Data Rest .
AGGIORNAMENTO 14 (26 settembre '17)
Come sottolineato da @gavenkoa nei commenti sulla domanda dei PO, il supporto del compilatore JDK9 non è ancora disponibile (Numero 985). Sembra anche che non sarà una soluzione facile per il team Lombok aggirare.
AGGIORNAMENTO 15 (26 marzo 18)
Il log delle modifiche di Lombok indica a partire dalla v.1.16.20 "La compilazione di lombok su JDK1.9 è ora possibile " anche se # 985 è ancora aperto.
Le modifiche per adattarsi a JDK9, tuttavia, hanno richiesto alcune modifiche sostanziali; tutto isolato alle modifiche alle impostazioni predefinite di configurazione. È un po 'preoccupante il fatto che abbiano introdotto modifiche di rottura, ma la versione ha solo superato il numero di versione "Incrementale" (passando da v1.16.18 a v1.16.20). Dato che questo post riguardava la sicurezza, se avessi un yarn/npm
sistema di compilazione simile che si è automaticamente aggiornato all'ultima versione incrementale, potresti avere un brusco risveglio.
AGGIORNAMENTO 16 (9 gennaio 19)
Sembra che i problemi di JDK9 siano stati risolti e Lombok funzioni con JDK10 e persino con JDK11 per quanto ne so.
Una cosa che ho notato, tuttavia, che riguardava un aspetto della sicurezza è il fatto che il registro delle modifiche che va dalla v1.18.2 alla v1.18.4 elenca due voci come BREAKING CHANGE
!? Non sono sicuro di come si verifichi un cambiamento sostanziale in un aggiornamento "patch" semver. Potrebbe essere un problema se si utilizza uno strumento che aggiorna automaticamente le versioni della patch.
javac
per aprire l'accesso allesun.*
classi interne ((