Ich habe gerade angefangen, Lombok zu benutzen. Bisher gefällt es mir, aber ein Nachteil, den ich nicht erwähnt habe, war die Umgestaltung der Unterstützung.
Wenn Sie eine Klasse mit Anmerkungen versehen haben @Data
, werden die Getter und Setter basierend auf den Feldnamen für Sie generiert. Wenn Sie einen dieser Getter in einer anderen Klasse verwenden und dann entscheiden, dass das Feld einen schlechten Namen hat, werden die Verwendungen dieser Getter und Setter nicht gefunden und der alte Name durch den neuen Namen ersetzt.
Ich würde mir vorstellen, dass dies über ein IDE-Plug-In und nicht über Lombok erfolgen müsste.
UPDATE (22. Januar 13)
Nachdem ich Lombok 3 Monate lang verwendet habe, empfehle ich es für die meisten Projekte. Ich habe jedoch einen anderen Nachteil gefunden, der dem oben aufgeführten ähnlich ist.
Wenn Sie eine Klasse haben, sagen wir MyCompoundObject.java
, die 2 Mitglieder hat, die beide mit Anmerkungen versehen @Delegate
sind, myWidgets
und myGadgets
wenn Sie myCompoundObject.getThingies()
von einer anderen Klasse aus anrufen , ist es unmöglich zu wissen, ob sie an die delegiert wird Widget
oder Gadget
weil Sie nicht mehr innerhalb der IDE zur Quelle springen können.
Die Verwendung der Eclipse "Delegate-Methoden generieren ..." bietet Ihnen die gleiche Funktionalität, ist genauso schnell und ermöglicht das Springen von Quellen. Der Nachteil ist, dass es Ihre Quelle mit Boilerplate-Code überfüllt, der den Fokus von den wichtigen Dingen ablenkt.
UPDATE 2 (26. Februar 13)
Nach 5 Monaten verwenden wir immer noch Lombok, aber ich habe einige andere Probleme. Das Fehlen eines deklarierten Getters & Setters kann manchmal ärgerlich werden, wenn Sie versuchen, sich mit neuem Code vertraut zu machen.
Wenn ich zum Beispiel eine Methode mit dem Namen getDynamicCols()
sehe, aber nicht weiß, worum es geht, muss ich einige zusätzliche Hürden überwinden, um den Zweck dieser Methode zu bestimmen. Einige der Hürden sind Lombok, andere das Fehlen eines Lombok Smart Plugins. Zu den Hürden gehören:
- Mangel an JavaDocs. Wenn ich das Feld javadociere, würde ich hoffen, dass der Getter und der Setter dieses Javadoc durch den Lombok-Kompilierungsschritt erben würden.
- Zur Methodendefinition springen springt mich zur Klasse, aber nicht zu der Eigenschaft, die den Getter generiert hat. Dies ist ein Plugin-Problem.
- Offensichtlich können Sie in einem Getter / Setter keinen Haltepunkt setzen, es sei denn, Sie generieren oder codieren die Methode.
- HINWEIS: Diese Referenzsuche ist kein Problem, wie ich es zuerst dachte. Sie müssen jedoch eine Perspektive verwenden, die die Gliederungsansicht aktiviert. Für die meisten Entwickler kein Problem. Mein Problem war, dass ich Mylyn verwende, das meine
Outline
Ansicht filtert , sodass ich die Methoden nicht gesehen habe. Suche nach fehlenden Referenzen. Wenn ich sehen möchte, wer anruft getDynamicCols(args...)
, muss ich den Setter generieren oder codieren, um nach Referenzen suchen zu können.
UPDATE 3 (7. März 13)
Ich denke, ich lerne, die verschiedenen Methoden in Eclipse anzuwenden. Sie können einen bedingten Haltepunkt (BP) für eine von Lombok generierte Methode festlegen. In der Outline
Ansicht können Sie mit der rechten Maustaste auf die Methode klicken, um Toggle Method Breakpoint
. Wenn Sie dann auf den BP klicken , können Sie in der Debugging- Variables
Ansicht sehen, wie die generierte Methode die Parameter benannt hat (normalerweise derselbe wie der Feldname), und schließlich in der Breakpoints
Ansicht mit der rechten Maustaste auf den BP klicken und Breakpoint Properties...
eine Bedingung hinzufügen. Nett.
UPDATE 4 (16. August 13)
Netbeans mag es nicht, wenn Sie Ihre Lombok-Abhängigkeiten in Ihrem Maven Pom aktualisieren. Das Projekt wird immer noch kompiliert, aber Dateien werden wegen Kompilierungsfehlern markiert, da die von Lombok erstellten Methoden nicht angezeigt werden. Durch Löschen des Netbeans-Cache wird das Problem behoben. Ich bin mir nicht sicher, ob es eine Option "Projekt bereinigen" wie in Eclipse gibt. Kleines Problem, wollte es aber bekannt machen.
UPDATE 5 (17. Januar 14)
Lombok spielt nicht immer gut mit Groovy oder zumindest dem groovy-eclipse-compiler
. Möglicherweise müssen Sie Ihre Version des Compilers herunterstufen.
Maven Groovy und Java + Lombok
UPDATE 6 (26. Juni 14)
Ein Wort der Warnung. Lombok macht leicht süchtig und wenn Sie an einem Projekt arbeiten, bei dem Sie es aus irgendeinem Grund nicht verwenden können, wird es Sie nerven. Sie sind vielleicht besser dran, wenn Sie es überhaupt nicht benutzen.
UPDATE 7 (23. Juli 14)
Dies ist ein interessantes Update, da es sich direkt mit der Sicherheit der Übernahme von Lombok befasst, nach der das OP gefragt hat.
Ab Version 1.14 wurde die @Delegate
Anmerkung auf einen experimentellen Status herabgestuft . Die Details sind auf ihrer Website dokumentiert ( Lombok Delegate Docs ).
Die Sache ist, wenn Sie diese Funktion verwenden, sind Ihre Backout-Optionen begrenzt. Ich sehe die Optionen als:
- Entfernen Sie
@Delegate
Anmerkungen manuell und generieren / handcodieren Sie den Delegatencode. Dies ist etwas schwieriger, wenn Sie Attribute in der Anmerkung verwenden.
- Löschen Sie die Dateien mit der
@Delegate
Anmerkung und fügen Sie sie möglicherweise wieder in die gewünschten Anmerkungen ein.
- Aktualisieren Sie niemals Lombok oder warten Sie eine Gabel (oder leben Sie mit Erfahrungsfunktionen).
- Delombok dein gesamtes Projekt und benutze Lombok nicht mehr.
Soweit ich das beurteilen kann, hat Delombok keine Option, eine Teilmenge von Anmerkungen zu entfernen . Zumindest für den Kontext einer einzelnen Datei ist alles oder nichts. Ich habe ein Ticket geöffnet , um diese Funktion mit Delombok-Flaggen anzufordern, aber ich würde das in naher Zukunft nicht erwarten.
UPDATE 8 (20. Oktober 14)
Wenn es eine Option für Sie ist, bietet Groovy die meisten Vorteile von Lombok sowie eine Bootsladung anderer Funktionen, einschließlich @Delegate . Wenn Sie der Meinung sind, dass es Ihnen schwer fällt, die Idee an die Mächte zu verkaufen, werfen Sie einen Blick auf die @CompileStatic
oder die @TypeChecked
Anmerkung, um zu sehen, ob dies Ihrer Sache helfen kann. Tatsächlich lag der Schwerpunkt der Version von Groovy 2.0 auf der statischen Sicherheit .
UPDATE 9 (1. September 15)
Lombok wird immer noch aktiv gewartet und verbessert , was ein gutes Zeichen für das Sicherheitsniveau der Adoption ist. Die @ Builder- Anmerkungen sind eine meiner neuen Lieblingsfunktionen.
UPDATE 10 (17. November 15)
Dies scheint nicht direkt mit der Frage des OP verbunden zu sein, ist aber eine Weitergabe wert. Wenn Sie nach Tools suchen, mit denen Sie die Menge des von Ihnen geschriebenen Boilerplate-Codes reduzieren können, können Sie auch Google Auto - insbesondere AutoValue - ausprobieren . Wenn Sie sich ihr Dia-Deck ansehen , finden Sie in der Liste Lombok eine mögliche Lösung für das Problem, das sie zu lösen versuchen. Die Nachteile, die sie für Lombok auflisten, sind:
- Der eingefügte Code ist unsichtbar (Sie können die generierten Methoden nicht "sehen") [ed note - eigentlich können Sie das, aber es ist nur ein Dekompiler erforderlich]
- Die Compiler-Hacks sind nicht standardisiert und zerbrechlich
- "Aus unserer Sicht ist Ihr Code nicht mehr wirklich Java"
Ich bin mir nicht sicher, wie sehr ich ihrer Bewertung zustimme. Und angesichts der Nachteile von AutoValue, die in den Folien dokumentiert sind, bleibe ich bei Lombok (wenn Groovy keine Option ist).
UPDATE 11 (8. Februar 16)
Ich habe herausgefunden, dass Spring Roo einige ähnliche Anmerkungen hat . Ich war ein wenig überrascht, als ich herausfand, dass Roo immer noch eine Sache ist und die Dokumentation für die Anmerkungen etwas rau ist. Das Entfernen sieht auch nicht so einfach aus wie De-Lombok. Lombok scheint die sicherere Wahl zu sein.
UPDATE 12 (17. Februar 16)
Während ich versuchte, Rechtfertigungen dafür zu finden, warum es sicher ist, Lombok für das Projekt, an dem ich gerade arbeite, einzubringen, fand ich ein Stück Gold, das mit v1.14
- The Configuration System ! Dies bedeutet, dass Sie ein Projekt so konfigurieren können, dass bestimmte Funktionen, die Ihr Team als unsicher oder unerwünscht erachtet, deaktiviert werden. Besser noch, es kann auch eine verzeichnisspezifische Konfiguration mit unterschiedlichen Einstellungen erstellen. Das ist fantastisch.
UPDATE 13 (4. Oktober 16)
Wenn Ihnen so etwas wichtig ist, war es für Oliver Gierke sicher, Lombok zu Spring Data Rest hinzuzufügen .
UPDATE 14 (26. September 17)
Wie von @gavenkoa in den Kommentaren zur OP-Frage hervorgehoben, ist die JDK9-Compiler-Unterstützung noch nicht verfügbar ( Problem Nr. 985). Es klingt auch so, als ob es für das Lombok-Team keine einfache Lösung sein wird, sich fortzubewegen.
UPDATE 15 (26. März 18)
Das Lombok-Änderungsprotokoll zeigt ab Version 1.16.20 an, dass das Kompilieren von Lombok auf JDK1.9 jetzt möglich ist , obwohl # 985 noch offen ist.
Änderungen an JDK9 erforderten jedoch einige wichtige Änderungen. Alle sind auf Änderungen der Konfigurationsstandards isoliert. Es ist ein wenig besorgniserregend, dass sie grundlegende Änderungen eingeführt haben, aber die Version hat nur die "Inkrementelle" Versionsnummer (von v1.16.18 auf v1.16.20) erhöht. Da es in diesem Beitrag um die Sicherheit ging yarn/npm
, könnten Sie ein unhöfliches Erwachen erleben, wenn Sie ein ähnliches Build-System hätten, das automatisch auf die neueste inkrementelle Version aktualisiert wurde.
UPDATE 16 (9. Januar 19)
Es scheint, dass die JDK9-Probleme behoben wurden und Lombok mit JDK10 und sogar JDK11 arbeitet, soweit ich das beurteilen kann.
Eine Sache, die mir aus Sicherheitsgründen aufgefallen ist, ist die Tatsache, dass im Änderungsprotokoll von Version 1.18.2 auf Version 1.18.4 zwei Elemente als BREAKING CHANGE
! Aufgeführt werden . Ich bin mir nicht sicher, wie eine bahnbrechende Änderung in einem semver "Patch" -Update geschieht. Kann ein Problem sein, wenn Sie ein Tool verwenden, das Patch-Versionen automatisch aktualisiert.
javac
um den Zugriff auf internesun.*
Klassen zu öffnen ((