Lombok – tworzenie obiektów

Wstęp

Jako programista pewnie już wiesz lub niedługo się dowiesz, że jak coś działa i ciągle tego używamy, to staramy się ukryć nasz kod. Udostępniamy tylko metody bądź inne elementy np.: adnotację, aby zwiększyć przejrzystość kodu. Biblioteka Lombok powstała właśnie w celu zmniejszenia tzw. boilerplate code. Lombok ciągle się rozwija, dodając coraz nowe rozwiązania do istniejącej puli adnotacji.

Klasa POJO

Do tej pory w swoich programach prawdopodobnie używałaś//-łeś klasycznych rozwiązań Javy  przy tworzeniu  getterów, setterów, metod toString() itp.
Wyglądało to mniej więcej tak:

Przykład

public class User {

   private String firstName;

   private String lastName;

   private LocalDate dayOfBirth;

   private String phoneNumber;

   public User(String firstName, String lastName, LocalDate dayOfBirth, String phoneNumber) {
       this.firstName = firstName;
       this.lastName = lastName;
       this.dayOfBirth = dayOfBirth;
       this.phoneNumber = phoneNumber;
   }

   public String getFirstName() {
       return firstName;
   }

   public String getLastName() {
       return lastName;
   }

   public LocalDate getDayOfBirth() {
       return dayOfBirth;
   }

   public String getPhoneNumber() {
       return phoneNumber;
   }

   @Override
   public String toString() {
       return "User{" +
               "firstName='" + firstName + '\'' +
               ", lastName='" + lastName + '\'' +
               ", dayOfBirth=" + dayOfBirth +
               ", phoneNumber='" + phoneNumber + '\'' +
               '}';
   }

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;

       User user = (User) o;

       if (!getFirstName().equals(user.getFirstName())) return false;
       if (!getLastName().equals(user.getLastName())) return false;
       if (!getDayOfBirth().equals(user.getDayOfBirth())) return false;
       return getPhoneNumber().equals(user.getPhoneNumber());
   }

   @Override
   public int hashCode() {
       int result = getFirstName().hashCode();
       result = 31 * result + getLastName().hashCode();
       result = 31 * result + getDayOfBirth().hashCode();
       result = 31 * result + getPhoneNumber().hashCode();
       return result;
   }
}

W przypadku większych klas gdzie pól jest dużo więcej i gdzie dodatkowo pojawiają się metody obsługujące logikę biznesową, ilość linii kodu w klasie potrafi być zatrważająca.

Lombok – @Data

Adnotacja @Data generuje prawie wszystkie elementy jak w powyższym przykładzie.
Wywołanie tej adnotacji powoduje wytworzenie wszystkich getterów i setterów, metod toString()equals()hashCode(). Niestety konstruktor bazujący na tej adnotacji jest konstruktorem domyślnym bądź takim, który bazuje tylko na polach typu final.
Aby obsłużyć konstruktor bazujący na polach prywatnych, tak jak w przykładzie, potrzebujemy wesprzeć klasę adnotacją @AllArgsConstructor.

Przykład

@Data
@AllArgsConstructor
public class User {
   private String firstName;

   private String lastName;

   private LocalDate dayOfBirth;

   private String phoneNumber;
}

W tym miejscu należy zwrócić uwagę na ważny element. Wszystkie pola klasy z adnotacja @Data będą posiadały publiczne gettery i settery. Klasa zatem jest mutowalna!!! (więcej o mutowalności TUTAJ)

Lombok – @Value

W odróżnieniu od @Data, adnotacja @Value  wytworzy klasę niemutowalną. Wszystkie pola klasy automatycznie otrzymują słowa kluczowe private oraz final. Nie zostają wytworzone settery. Natomiast konstruktor bierze pod uwagę wszystkie pola zdefiniowane w klasie.

Przykład

@Value
public class User {
   private String firstName;

   private String lastName;

   private LocalDate dayOfBirth;

   private String phoneNumber;
}

Lombok – @Data & @Value, statyczny konstruktor

Kiedy chcemy użyć statycznego konstruktora, możemy poinformować Lombok, że mamy taką potrzebę. Dla adnotacji @Data w przypadku, gdy wszystkie pola są non-final, dodajemy informację w obrębie @AllArgsConstructor.

@Data
@AllArgsConstructor(staticName = “of”)
public class User {
...
}

W przypadku adnotacji @Value dodatkowa informacja “włączająca” możliwość wytworzenia konstruktora statycznego podawana jest na poziomie tej adnotacji:

@Value(staticConstructor = "of")
public class User {
...
}

Podsumowanie

Jak zaprezentowano, Lombok pozwala w szybki i zgrabny sposób pozbyć się zbędnego kodu poprzez użycie zdefiniowanych adnotacji. Oczywiście, jeżeli istnieje potrzeba wybiórczego traktowania pól bądź definiowania specyficznych konstruktorów Lombok nie będzie pomocny. Jednak z własnego doświadczenia estymuję, że w większości przypadków jednak można na niego liczyć.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *