Per la gioia dei pigri

Già da diverso tempo utilizzo, sia per lavoro che per hobby, una libreria open source denominata Lombok: il nome richiama un’isola indonesiana dove tutti si trasferirebbero volentieri. In realtà è una utility che fa risparmiare tempo allo sviluppatore pigro (come me) e maniaco della pulizia del codice.

La libreria è un Annotation processor (APT), quindi durante la compilazione del progetto, farà l’interpretazione delle annotation (@NomeAnnotazione per intenderci) e eseguirà delle operazioni o semplicemente sostituirà il nostro codice con qualcos’altro durante la generazione della classe. La libreria è open source ed è possibile includerla nei progetti a scopi commerciali.

Come utilizzare Lombok

Supponiamo di dover creare un nuovo bean POJO (Plain Old Java Object), quindi che ha delle proprietà interrogabili. Senza Lombok scriveremo il nostro codice in questo modo:

public class Sfera implements Serializable {

	//Definisco il diametro
	private int diametro;
	[...]
	
	//Definisco il getter
	public int getDiametro()
	{
	   return this.diametro;
	} 
	
	public void setDiamentro(int value)
	{
	   this.diamentro = value;
	}
		
}

Niente di nuovo in questo codice, tutti i programmatori Java sono abituati a vederlo giornalmente, ma a mio parere una classe con 10 proprietà diventa lunga e difficile da mantenere. Qui entra in gioco Lombok: una volta installato (trovi le istruzioni in fondo all’articolo), potremo eliminare i nostri getter/setter e sostituirli con due semplici annotazioni:

public Sfera class implements Serializable {

   //Definisco il diamentro

	@Getter @Setter // <-- Lombok 
    private int diamentro;
}

Automaticamente, durante la compilazione, Lombok genera per noi getter e setter e il nostro codice rimane più pulito. Inoltre questi metodi saranno accessibili anche sull’IDE. Bene, ma io sono molto pigro e non voglio scrivere e ripetere le annotazioni @Getter e @Setter su tutte le proprietà! Esiste un’altra annotazione chiamata @Data che genera tutti i getter/setter per le proprietà, basta annotare la classe coinvolta, in questo modo:

@Data
public Sfera class implements Serializable {

   //Definisco il diamentro
   private int diamentro;
}

Automaticamente sull’IDE ci troveremo i getter/setter gia dichiarati

  Sfera sfera = new Sfera();
  sfera.setDiametro(3);

  System.out.println("Il diametro della sfera è " + sfera.getDiametro());

Facile e veloce, no? Un’altra annotazione utilissima è @AllArgsConstructor che agisce sul costruttore della classe. Riprendiamo la nostra classe Sfera senza Lombok, aggiungendo qualche proprietà:

@Data
public Sfera class implements Serializable {

    private String nome;
    private int diametro;
    private String colore;

   //Costruttore della classe
   public Sfera(String nome, int diametro, String colore)
	{
	   this.nome = nome;
	   this.diametro = diametro;
	   this.colore = colore;
	
	}
}

Se aggiungiamo l’annotazione @AllArgsConstructor sulla classe (oltre a @Data) possiamo omettere il costruttore che usa tutti i parametri della classe, ci penserà Lombok a generarlo per noi:


@Data
@AllArgConstructor
public Sfera class implements Serializable {

  private String nome;
  private int diametro;

}

L’annotazione @Log

Avendo bisogno continuamente di vedere che cosa sta facendo il nostro programma, immagino che il codice sotto sia familiare:

import java.util.logging.Logger;
public class ContenitoreDiSfere {

   // Dichiaro il logger (java.util.logging.logger)
   private static log = Logger.getLogger(ContentitoreDiSfere.class.getName());

   public ContenitoreDiSfere()
   {
      log.info("OK, io sono pronto!");
   }

}

Anche in questo caso Lombok ci fa risparmiare tempo e codice con l’annotazione @Log. Questa annotazione scritta sopra alla classe dichiara la variabile (statica) log:

@Log
public class ContenitoreDiSfere {

  public ContenitoreDiSfere()
  {
      log.info("OK, io sono pronto!");
  }
}

La domanda sorge spontanea: “Ma se io volessi utilizzare un altro logger?” Semplice: possiamo cambiare annotazione e utilizzare gli altri logger standard. Ovviamente le varie librerie dovranno essere opportunamente referenziate e disponibili nelle librerie o nel pom.xml se si usa Maven. Qui sotto riportiamo il mapping tra annotazione e corrispondente logger:

  • @Logj4: org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
  • @CommonsLog: org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
  • @Log4J2 (versione 2 di log4j): org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
  • @Slf4J: org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  • @XSlf4j: org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

Installare Lombok

  • Per Eclipse: scaricato http://projectlombok.googlecode.com/files/lombok.jar, fai doppio click sul file e si aprirà l’interfaccia di setup. Questa mostrerà tutte le versioni di Eclipse installate sul computer. E’ possibile selezionarle premere “Installa”. Una volta ravviato Eclipse, Lombok è pronto all’uso.
  • Per IntelliJ IDEA: scarica e installa il plugin dal repository ufficiale
  • Per Maven: aggiungi questa dipendenza nel file pom.xml:
  • <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
    	<version>1.12.4</version>
    	<scope>provided</scope>
    </dependency>
    

    Conclusione

    Lombok offre molte utility che ti fanno risparmiare le solite ripetitive righe di codice. A mio avviso può diventare un buon compagno di hobby e lavoro, senza creare scompiglio e incompatibilità con il codice esistente.

1 Posts

Lavoro come responsabile IT e project manager per una società di firenze. Ho la passione dell'informatica sin da quando ero bambino, amo la cucina e sono ossessionato dalla musica.