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.