Lombok: Stop al codice “boilerplate”

Tutti i programmatori conoscono Java e chi non lo conosce quantomeno ne ha sentito parlare. Chi utilizza Java per lavorare, ma anche solo per scopi personali, sa che per rispettare al massimo il principio dell’incapsulamento quando si utilizza un pojo (un oggetto contenente delle proprietà e i soli metodi per accedere e settare queste proprietà) è costretto a scrivere tante linee di codice per i classici metodi getter e setter delle proprietà private che il pojo possiede, ma anche per creare i vari costruttori di cui si ha la necessità. Molto spesso la cosa che si fa, e scrivere le proprietà private del pojo e generare tutti i metodi classici (getter/setter, costruttori ecc) in maniera automatica, attraverso strumenti che ci mette a disposizione il nostro IDE di sviluppo. Si capisce subito come è facile avere delle classi con più di 100 linee di codice, non è sempre bello avere classi “lunghe” soprattutto se al livello di logica non fanno nulla, ma cosa peggiore, quando si cancella una proprietà privata della classe bisogna eliminare anche i rispettivi metodi getter e setter e rivedere nel caso anche i costruttori.

Come direbbero i fantastici inglesini:

We have a boilerplate code

Dicesi boilerplate code una sezione di codice che viene ripetuta molte volte all’interno del programma, che può o non può avere piccole cose diverse. In italiano un boilerplate code può essere tradotto come codice verboso.

Ma esiste una soluzione a questo cavolo di boilerplate 😡?……La risposta è LOMBOK.

La libreria lombok, all’inizio questa parola ci potrebbe spaventare un pochino,  permette di creare getter, setter, toString, equals, hashCode e costruttori in maniera automatica, ma la cosa figa e che all’interno della classe non li vediamo, i metodi ci sono ma non si vedono è FIGHISSIMO :). È necessario scrivere la classe, con le proprietà che si desidera, dopodiché aggiungere le annotation di lombok, vediamo tra poco cosa sono le annotation, ed il gioco è fatto.

Per mostrare i vantaggi di questa libreria farò un esempio, sperando di farvi apprezzare la potenza di lombok. Vi anticipo solo in breve quali sono i vantaggi che possiamo avere:

  • Ridurre la verbosità del codice
  • Scrittura del codice più veloce
  • Evitare stupidi errori

 

SETUP:

Prima di tutto importiamo la dipendenza di Lombok, è possibile scaricarla al seguente link: https://mvnrepository.com/artifact/org.projectlombok/lombok-maven scegliete la versione che vi serve e il vostro gestore di dipendenze (es. maven, gradle ecc).

ESEMPIO LOMBOK:

@Data
public class User implements Serializable {
	@NonNull
	private String name;
	
        @NonNull
	private String surname;
	
        @NonNull
	private String dateOfBirth;

}

Possiamo notare 2 annotation Data e NonNull:

  1. @Data: Quest’ annotation genera tutto il codice verboso che ogni volta viene scritto per un bean, infatti Data genera i seguenti metodi: @ToString@EqualsAndHashCode@Getter / @Setter e @RequiredArgsConstructor
  2. @NonNull: La seguente annotation, messa a disposizione da Lombok, genera un controllo per verificare se i campi sono nulli. Un esempio di controllo che viene fatto è il seguente:
    if (name == null) throw new NullPointerException("name");

Adesso andiamo a vedere come sarebbe stata la classe senza l’aiuto del nostro nuovo amico Lombok.

ESEMPIO SENZA LOMBOK:

public class User implements Serializable {
	
	private String name;
	
	private String surname;
	
	private String dateOfBirth;
	
	public User() {
	}
	
	public User(String pName, String pSurname, String pDateOfBirth) {
		this.name = pName;
		this.surname = pSurname;
		this.dateOfBirth = pDateOfBirth;
	}
	
	public String getName() {
		return name;
	}
	
	public String getSurname() {
		return surname;
	}
	
	public String getDateOfBirth() {
		return dateOfBirth;
	}
	
	public String setName(String pName) {
		if (name == null) 
			throw new NullPointerException("name is required");
		this.name = pName;
	}
	
	public String setSurname(String pSurname) {
		if (pSurname == null) 
			throw new NullPointerException("surname is required");
		this.surname = pSurname;
	}
	
	public String setDateOfBirth(String pDateOfBirth) {
		if (pDateOfBirth == null) 
			throw new NullPointerException("date of birth is required");
		this.dateOfBirth = pDateOfBirth;
	}
}

È facile notare come la classe User che non fa uso della libreria Lombok, è molto più verbosa rispetto alla classe User che fa uso di Lombok. Inserendo i classici metodi getter e setter più il costruttore parametrico non solo inseriamo la sezione di codice chiamata boilerplate, ma è facile introdurre bug come: dimenticare un metodo setter o un metodo getter, dimenticare un controllo null ecc.. invece grazie a Lombok non corriamo mai questi problemi.

ALTRE ANNOTATION UTILI:

  • @Getter: Puoi marchiare la classe o i campi con Getter, in questo modo verranno generati in maniera automatica tutti i metodi getter che desideri.
  • @Setter:  Simile all’annotation Getter ma verranno generati tutti i metodi setter di cui hai bisgogno.
  • @Synchronized: Funziona uguale al metodo synchronized, quindi può essere usata solo su un metodo statico e di istanza.
  • @ToString: La documentazione ufficiale di Lombok ci suggerisce di annotare ogni bean come @ToString, visto che viene fornita un implementazione del metodo toString(). Per saperne di più su quest’ annotation: https://projectlombok.org/features/ToString
  • @NoArgsConstructor: Genera un costruttore non parametrico, per intenderci viene generato quello di default.
  • @AllArgsConstructor: Viene creato un costruttore con tutti i campi presenti nel bean. Nel esempio precedente visto che la classe è stata marchiata con @Data è quest’ultima include l’annotation @AllArgsConstructor viene generato quindi il seguente costruttore:
    public User(String name, String surname, String dateOfBirth) {
            this.name = name;
            this.surname = surname;
    	this.dateOfBirth = dateOfBirth;
    }
    

CONCLUSIONI:

Spero di avermi fatto apprezzare la vera forza di questa libreria, come sempre vi lascio alcuni link utili che vi possono essere d’aiuto nel momento in cui volete approfondire meglio l’argomento, per quanto mi riguarda merita davvero tanto.

Documentazione ufficiale: https://projectlombok.org/

Tutte le annotation di Lombok: https://projectlombok.org/features/all

Guida (in inglese) sull’uso di Lombok: https://gualtierotesta.wordpress.com/2014/03/03/tutorial-using-lombok-to-reduce-boilerplate-code-in-java/

P.s. Se l’articolo vi è stato di vostro gradimento condividetelo sui vostri social, potete sempre lasciare un commento (spero sia positivo 🙂 ) anche per richiedere un articolo su qualche tecnologia che vi aggrada. Vi ringrazio per la lettura e per la visita. Mi raccomando sempre #programmingModeOn

About the Author

aparzi

aparzi

Fondatore di questo blog e studente di Informatica presso l' Università degli Studi del Molise, contemporaneamente lavoro alla Xeos.it come Software Developer utilizzando tecnologie quali Java e Spring-Boot. Nel mio tempo libero mi piace imparare nuove tecnologie soprattutto lato frontend, come React oppure Angular. Sono sempre stato un appassionato del mondo dell' informatica e ho un debole per il sistema operativo Linux.

4 thoughts on “Lombok: Stop al codice “boilerplate”

Leave a Reply

Your email address will not be published. Required fields are marked *