Uwielbiam projekt Lombok, ale obecnie czytam i wypróbowuję niektóre nowe funkcje Java 14.
Wewnątrz nowej możliwości znajduje się słowo kluczowe record, które pozwala utworzyć klasę z już wbudowaną następującą funkcjonalnością: konstruktor, prywatne pola końcowe, akcesory, equals / hashCode, getters, metody toString.
Teraz moje pytanie brzmi: lepiej polegać na funkcji Lombok, czy też powinniśmy zacząć korzystać z funkcji nagrywania:
Lepiej użyć tego:
record Person (String name, String surname) {}
albo to:
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
@Getter private int name;
@Getter private int surname;
}
Jakie są zalety i wady obu podejść?
record
nie będzie działać na rzeczy oczekujące programów pobierających i ustawiających w stylu JavaBeans.alice.phoneNumber()
zamiast konwencji JavaBeans o prefiksieget
, jak walice.getPhoneNumber()
.record
funkcja jest funkcją podglądu , ale nie jest jeszcze gotowa do użycia w produkcji.Odpowiedzi:
Lombok i
record
funkcja języka Java to różne narzędzia do różnych rzeczy. Jest to powierzchowne nakładanie się, ale nie pozwól, aby cię to rozproszyło.Lombok dotyczy głównie wygody syntaktycznej ; jest to makroprocesor wstępnie załadowany kilkoma znanymi użytecznymi wzorcami kodu. Nie nadaje żadnej semantyki; po prostu automatyzuje wzorce, zgodnie z niektórymi pokrętłami ustawionymi w kodzie za pomocą adnotacji. Lombok polega wyłącznie na wygodzie wdrażania klas przenoszących dane.
Zapisy są cechą semantyczną ; są krotkami nominalnymi . Dokonując deklaracji semantycznej, która
Point
jest krotką(int x, int y)
, kompilator może czerpać swoją reprezentację, a także protokoły konstrukcji, deklaracji, równości, mieszania i ciągów znaków z tego opisu stanu. Ponieważ zawierają one semantykę, czytniki i struktury mogą również z większym zaufaniem rozumieć interfejs API rekordów. (Może to być również wygodne pod względem składni; jeśli tak, to świetnie.)źródło
Grałem z tą kombinacją również od jakiegoś czasu i przy odrobinie praktyczności mogłem wymienić następujące różnice:
Lombok
@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
.EqualsAndHashCode
nie jest taki sam, jak można się spodziewać, jeśli chodzi o migrację do rekordów .Dokumentacja
Oczywiście na co dzień, w oparciu o wymagania projektu zawsze mądrze jest wybrać sposób postępowania i postępowania.
źródło
Uwaga: Zamiast choinki z adnotacjami możesz po prostu użyć
@Value
w klasie. Pamiętaj, że dzięki temu klasa jest ostateczna, a wszystkie pola są prywatne i końcowe, a także cała reszta. Jest to bliskie temu, czym są rekordy (one także są ostateczne, a wszystkie pola w nich są ostateczne).record
jest wciąż w wersji zapoznawczej, więc w przypadku kodu produkcyjnego nie jest jeszcze odpowiednie. Użyj lomboka.Gdy rekordy są poza podglądem, jest to bardziej skomplikowane. Lombok FAR bardziej elastyczne; możesz łatwo podmienić nowy aspekt bez konieczności przepisywania całego kodu (możesz na przykład dodać klauzulę „extends” do swojej klasy bez konieczności ręcznego pisania metody equals i hashCode; coś nie da ci rekordy). Lombok oferuje również więcej funkcji: Możesz na przykład dodać konstruktora, dodając
@Builder
adnotację; nic nie może zrobić.Jeśli jest bardzo mało prawdopodobne, że użyjesz tego w klasie, którą projektujesz - użyłbym rekordów.
ZASTRZEŻENIE: Jestem głównym współpracownikiem Projektu Lombok.
źródło