Właśnie zacząłem używać Lombok dzisiaj. Do tej pory mi się podobało, ale jedną wadą, o której nie wspomniałem, było wsparcie refaktoryzacji.
Jeśli masz klasę opatrzoną adnotacjami @Data
, wygeneruje ona dla ciebie funkcje pobierające i ustawiające na podstawie nazw pól. Jeśli użyjesz jednego z tych modułów pobierających w innej klasie, a następnie zdecydujesz, że pole ma słabą nazwę, nie znajdzie zastosowań tych modułów pobierających i ustawiających i zastąpi starą nazwę nową nazwą.
Wyobrażam sobie, że trzeba by to zrobić za pomocą wtyczki IDE, a nie przez Lombok.
AKTUALIZACJA (22 stycznia 2013 r.)
Po 3 miesiącach używania Lombok nadal polecam go do większości projektów. Znalazłem jednak kolejną wadę podobną do powyższej.
Jeśli masz klasę, powiedzmy, MyCompoundObject.java
że ma 2 członków, obaj z adnotacjami @Delegate
, powiedz myWidgets
i myGadgets
, kiedy dzwonisz myCompoundObject.getThingies()
z innej klasy, nie można wiedzieć, czy jest delegowana do Widget
lub Gadget
ponieważ nie możesz już przeskakiwać do źródła w IDE.
Korzystanie z Eclipse „Generuj metody delegowania ...” zapewnia tę samą funkcjonalność, jest równie szybkie i zapewnia przeskakiwanie źródła. Minusem jest to, że zaśmieca twoje źródło kodem, który odwraca uwagę od ważnych rzeczy.
AKTUALIZACJA 2 (26 lutego 2013 r.)
Po 5 miesiącach nadal używamy Lombok, ale mam jeszcze inne problemy. Brak deklarowanego gettera i settera może być irytujący, gdy próbujesz zapoznać się z nowym kodem.
Na przykład, jeśli widzę metodę wywoływaną, getDynamicCols()
ale nie wiem, o co chodzi, mam dodatkowe przeszkody, aby przeskoczyć, aby określić cel tej metody. Niektóre przeszkody to Lombok, niektóre brak inteligentnej wtyczki Lombok. Przeszkody obejmują:
- Brak JavaDocs. Gdybym javadoc pole, mam nadzieję, że getter i setter odziedziczą javadoc przez krok kompilacji Lombok.
- Przejdź do definicji metody przeskakuje mnie do klasy, ale nie do właściwości, która wygenerowała getter. To jest problem z wtyczką.
- Oczywiście nie możesz ustawić punktu przerwania w module pobierającym / ustawiającym, chyba że wygenerujesz lub zakodujesz metodę.
- UWAGA: Wyszukiwanie referencyjne nie stanowi problemu, tak jak na początku myślałem. Musisz jednak użyć perspektywy, która umożliwia widok Konspektu. Nie stanowi problemu dla większości programistów. Mój problem polegał na tym, że korzystam z Mylyn, który filtrował mój
Outline
widok, więc nie widziałem metod. Brak wyszukiwania referencji. Jeśli chcę zobaczyć, kto dzwoni getDynamicCols(args...)
, muszę wygenerować lub zakodować seter, aby móc wyszukiwać referencje.
AKTUALIZACJA 3 (7 marca 13)
Chyba nauczyłem się korzystać z różnych sposobów robienia rzeczy w Eclipse. W rzeczywistości można ustawić warunkowy punkt przerwania (BP) w metodzie generowanej przez Lombok. Korzystając z Outline
widoku, możesz kliknąć metodę prawym przyciskiem myszy Toggle Method Breakpoint
. Następnie po naciśnięciu BP można użyć Variables
widoku debugowania, aby zobaczyć, jak wygenerowana metoda nazywała parametry (zwykle takie same jak nazwa pola), a na koniec, użyj Breakpoints
widoku, aby kliknąć BP prawym przyciskiem myszy i wybrać, Breakpoint Properties...
aby dodać warunek. Miły.
AKTUALIZACJA 4 (16 sierpnia 13)
Netbeans nie lubi, gdy aktualizujesz swoje zależności Lombok w Maven pom. Projekt nadal się kompiluje, ale pliki są oznaczane jako zawierające błędy kompilacji, ponieważ nie widzi metod, które tworzy Lombok. Wyczyszczenie pamięci podręcznej Netbeans rozwiązuje problem. Nie jestem pewien, czy istnieje opcja „Wyczyść projekt”, tak jak w Eclipse. Drobny problem, ale chciałem go poinformować.
AKTUALIZACJA 5 (17 stycznia 14)
Lombok nie zawsze dobrze gra z Groovy, a przynajmniej z groovy-eclipse-compiler
. Może być konieczne obniżenie wersji kompilatora.
Maven Groovy i Java + Lombok
AKTUALIZACJA 6 (26 czerwca 14)
Słowo ostrzeżenia. Lombok jest nieco uzależniający i jeśli pracujesz nad projektem, z którego z jakiegoś powodu nie możesz go użyć, zirytuje cię to. Lepiej, żebyś nigdy go nie używał.
AKTUALIZACJA 7 (23 lipca 14)
To jest trochę interesująca aktualizacja, ponieważ bezpośrednio odnosi się do bezpieczeństwa przyjęcia Lomboka, o które prosiła OP.
Od wersji 1.4 @Delegate
adnotacja została zdegradowana do stanu eksperymentalnego. Szczegóły są udokumentowane na ich stronie ( dokumenty delegatów Lombok ).
Chodzi o to, że jeśli korzystasz z tej funkcji, opcje wycofywania są ograniczone. Widzę opcje jako:
- Usuń ręcznie
@Delegate
adnotacje i wygeneruj / podaj kod delegowany. Jest to trochę trudniejsze, jeśli używasz atrybutów w adnotacji.
- Delombokuj pliki z
@Delegate
adnotacjami i być może dodaj je ponownie w odpowiednich adnotacjach.
- Nigdy nie aktualizuj Lombok ani nie utrzymuj rozwidlenia (lub korzystaj z funkcji eksperymentalnych).
- Delombok cały projekt i przestań używać Lombok.
O ile mi wiadomo, Delombok nie ma opcji usuwania podzbioru adnotacji ; to wszystko albo nic, przynajmniej w kontekście pojedynczego pliku. Otworzyłem bilet z prośbą o tę funkcję z flagami Delombok, ale nie spodziewałbym się tego w najbliższej przyszłości.
AKTUALIZACJA 8 (20 października 2014 r.)
Jeśli jest to opcja dla Ciebie, Groovy oferuje większość takich samych korzyści Lombok, a także mnóstwo innych funkcji, w tym @Delegate . Jeśli uważasz, że trudno ci będzie sprzedać ten pomysł mocom, które są, spójrz na adnotację @CompileStatic
lub @TypeChecked
adnotację, aby sprawdzić, czy to może pomóc twojej sprawie. W rzeczywistości głównym celem wydania Groovy 2.0 było bezpieczeństwo statyczne .
AKTUALIZACJA 9 (1 września 15)
Lombok jest nadal aktywnie utrzymywany i rozwijany , co dobrze wróży poziomowi bezpieczeństwa adopcji. W @Builder adnotacje jest jednym z moich ulubionych nowych funkcji.
AKTUALIZACJA 10 (17 listopada 15)
To może nie wydawać się bezpośrednio związane z pytaniem PO, ale warto się nim podzielić. Jeśli szukasz narzędzi, które pomogą Ci zmniejszyć ilość kodu, który piszesz, możesz także sprawdzić Google Auto - w szczególności AutoValue . Jeśli spojrzysz na ich zjeżdżalnię , wypisz Lombok jako możliwe rozwiązanie problemu, który próbują rozwiązać. Wady, które wymieniają dla Lombok to:
- Wstawiony kod jest niewidoczny (nie możesz „zobaczyć” metod, które generuje) [zredaguj notatkę - właściwie możesz, ale wymaga tylko dekompilatora]
- Hacki kompilatora są niestandardowe i delikatne
- „Naszym zdaniem twój kod nie jest już tak naprawdę językiem Java”
Nie jestem pewien, jak bardzo zgadzam się z ich oceną. Biorąc pod uwagę wady AutoValue, które są udokumentowane na slajdach, będę trzymać się Lomboka (jeśli Groovy nie jest opcją).
AKTUALIZACJA 11 (8 lutego 16).
Dowiedziałem się, że Spring Roo ma podobne adnotacje . Byłem trochę zaskoczony, gdy dowiedziałem się, że Roo wciąż jest rzeczą, a znalezienie dokumentacji dla adnotacji jest nieco trudne. Usunięcie również nie wygląda tak łatwo jak de-lombok. Lombok wydaje się bezpieczniejszym wyborem.
AKTUALIZACJA 12 (17 lutego 2016)
Próbując znaleźć uzasadnienie, dlaczego bezpiecznie sprowadzić Lombok do projektu, nad którym aktualnie pracuję, znalazłem kawałek złota, który został dodany v1.14
- System konfiguracji ! Oznacza to, że możesz skonfigurować projekt, aby wyłączyć niektóre funkcje, które Twój zespół uzna za niebezpieczne lub niepożądane. Co więcej, może również tworzyć konfigurację specyficzną dla katalogu z różnymi ustawieniami. To jest niesamowite.
AKTUALIZACJA 13 (4 października 16).
Jeśli to dla ciebie ważne, Oliver Gierke uznał, że bezpiecznie jest dodać Lombok do Spring Data Rest .
AKTUALIZACJA 14 (26 września 17)
Jak wskazał @gavenkoa w komentarzach do pytania PO, obsługa kompilatora JDK9 nie jest jeszcze dostępna (numer 985). Wygląda na to, że zespół Lombok nie będzie łatwo go obejść.
AKTUALIZACJA 15 (26 marca 18)
Dziennik zmian Lombok wskazuje od 1.1.16.20 „ Kompilowanie lomboka na JDK1.9 jest teraz możliwe ”, chociaż # 985 jest nadal otwarty.
Zmiany w celu dostosowania JDK9 wymagały jednak pewnych przełomowych zmian; wszystkie odizolowane od zmian w ustawieniach domyślnych konfiguracji. To trochę niepokojące, że wprowadzili przełomowe zmiany, ale wersja tylko zderzyła się z numerem wersji „Przyrostowej” (od wersji 1.16.18 do wersji 1.16.20). Ponieważ ten post dotyczył bezpieczeństwa, jeśli masz yarn/npm
podobny system kompilacji, który automatycznie aktualizuje się do najnowszej wersji przyrostowej, możesz być w stanie rude przebudzenie.
AKTUALIZACJA 16 (9 stycznia 19)
Wygląda na to, że problemy z JDK9 zostały rozwiązane i Lombok współpracuje z JDK10, a nawet JDK11, o ile wiem.
Jedną z rzeczy, które zauważyłem, że dotyczy to kwestii bezpieczeństwa, jest fakt, że dziennik zmian z wersji 1.18.2 do wersji 1.18.4 wymienia dwie pozycje jako BREAKING CHANGE
!? Nie jestem pewien, jak zmienia się przełom w aktualizacji „łaty” semver. Może to stanowić problem, jeśli korzystasz z narzędzia, które automatycznie aktualizuje wersje poprawek.
javac
w celu otwarcia dostępu dosun.*
klas wewnętrznych ((