Press "Enter" to skip to content

Lombok – pozbycie się boilerplate kodu

0

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.

import lombok.Getter; 
import lombok.Setter; 

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

Po kompilacji otrzymamy następujący kod:

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) 😉).

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:

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.