Wraz z przyjściem do nowej pracy musiałem zapoznać się z zasadami obowiązującymi w trakcie pisania kodu (nazwy klas, metod, zmiennych są po POLSKU! 😱). Jednak przyszło mi się też przyjrzeć bibliotece Lombok. Jej głównym zadaniem jest pozbycie się boilerplate kodu przy definiowaniu nowych klas np. zgodnych ze standardem JavaBeans. I przyznam, że robi to całkiem nieźle!

Użycie Lombok w praktyce

Chociaż dzisiejsze IDE ułatwiają nam tworzenie standardowych getterów i setterów to przy pomocy adnotacji @Getter i @Setter umieszczonych nad klasą nie trzeba o to się martwić. Uzyskujemy przewagę taką, że gdy dochodzi nowe pole to nie musimy dodawać kolejnych metod do jego obsługi. Biblioteka w trakcie kompilacji załatwi to za nas! Dodatkowo adnotacje @Getter i @Setter można także umieszczać oddzielnie nad każdym z pól klasy.

1
2
3
4
5
6
7
8
9
10
import lombok.Getter; 
import lombok.Setter; 

@Getter 
@Setter 
public class Animal {
  
  private String name;
  private String kind; 
}

Po kompilacji otrzymamy następujący kod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Animal {
  
  private String name;
  private String kind;
   
  public Animal() {}
   
  public String getName() {
    return this.name;
  }
   
  public String getKind() {
    return this.kind;
  }
   
  public void setName(String var1) {
  this.name = var1;
  }
   
  public void setKind(String var1) {
    this.kind = var1;
  }
}

Przydatnymi adnotacjami są także:

  • @NoArgsConstructor - tworzy bezargumentowy konstruktor
  • @RequiredArgsConstructor - tworzy konstruktor z argumentami dla pól final
  • @AllArgsConstructor - tworzy konstruktor z argumentami dla wszystkich pól

@ToString i @EqualsAndHashCode wygenerują dla nas odpowiednie metody, które nadpiszą te domyślne z klasy Object. Warto powiedzieć też o adnotacji @Data, który spina w sobie kilka innych adnotacji:

  • @ToString
  • @EqualsAndHashCode
  • @Getter na wszystkich polach
  • @Setter na wszystkich polach, które nie są final
  • @RequiredArgsConstructor

Ciekawa adnotacja Builder

Dodatkowo należy przyjrzeć się rozwiązaniu wzorca projektowego Builder w przypadku Lomboka. Robi się to tylko poprzez adnotację @Builder nad klasą i voila! (notka: warto dodać jeszcze adnotację @AllArgsConstructor(access = AccessLevel.PRIVATE) 😉).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lombok.Builder;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;

@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class House {
  
  private String floor;
  private String walls;
  private String roofs;
  private String windows;
  private String doors;
}

Daje nam w rezultacie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class House {

  private String floor;
  private String walls;
  private String roofs;
  private String windows;
  private String doors;
  
  public static House.HouseBuilder builder() {
    return new House.HouseBuilder();
  }
  
  private House(String var1, String var2, String var3, String var4, String var5) {
    this.floor = var1;
    this.walls = var2;
    this.roofs = var3;
    this.windows = var4;
    this.doors = var5;
  }
  
  public static class HouseBuilder {
    
    private String floor;
    private String walls;
    private String roofs;
    private String windows;
    private String doors;
    
    HouseBuilder() {}
    
    public House.HouseBuilder floor(String var1) {
      this.floor = var1;
      return this;
    }
    
    public House.HouseBuilder walls(String var1) {
      this.walls = var1;
      return this;
    }
    
    public House.HouseBuilder roofs(String var1) {
      this.roofs = var1;
      return this;
    }
    
    public House.HouseBuilder windows(String var1) {
      this.windows = var1;
      return this;
    }
    
    public House.HouseBuilder doors(String var1) {
      this.doors = var1;
      return this;
    }
    
    public House build() {
      return new House(this.floor, this.walls, this.roofs, this.windows, this.doors);
    }
    
    public String toString() {
      return "House.HouseBuilder(floor=" + this.floor + ", walls=" + this.walls + ", roofs=" + this.roofs + ", windows=" + this.windows + ", doors=" + this.doors + ")";
    }
  }
}

Dalsze możliwości

Polecam poeksperymentować samemu z biblioteką Lombok. Potrafi ona znacząco uprościć kod chowając wiele powtarzalnych linijek w jednej adnotacji. Jednak trzeba zachować ostrożność przy jej wykorzystywaniu (warto spojrzeć na przykład z poprzedniego artykułu). O ile wyżej opisane możliwości są dosyć sprawdzone i przydatne w użyciu to w stosunku do innych adnotacji należy dokładnie przeczytać dokumentację bądź sprawdzić ich działanie na mniejszym projekcie.

Czy Ty w swoim projekcie wykorzystujesz bibliotekę Lombok? Czy jednak jesteś zwolennikiem posługiwania się IDE do generowania kodu? Podziel się swoim doświadczeniem w komentarzu bądź skontaktuj się ze mną mailowo.