Project Lombok: per chi ha le mani pigre!

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 . 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 , 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 : aggiungi questa dipendenza nel file pom.xml:

        org.projectlombok
        lombok
        1.12.4
        provided

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.

Tommaso Giachi

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.

  • musikele

    fighissima! tra l’altro sono in tanti a pensare che quei getter e setter non servano proprio a nulla. A quel punto meglio mettere le variabili pubbliche…

    • darkcg

      In tanti chi? Tutti coloro che non hanno la benchè minima idea di cosa sia l’incapsulamento? 😉

      • musikele

        Lo so che è una cosa standardizzata nel mondo java, e che questi “javabean” si imparano dalla lezione 0, ma se ci pensi, è codice inutile. Specialmente dove viene usato di più, ossia nei javabean. Inoltre posso farti un esempio con gwt, che compila codice Java in JavaScript: in JS non ci sono variabili private, e l’incapsulamento si realizza con le clojure . Gwt ti nasconde tutto, insomma lo sviluppatore potrebbe proprio ignorare quello che accade sotto al cofano, ma queste clojure funzionano al prezzo di riempire la memoria del browser con tante funzioni anonime (e ogni funzione anonima copia l’intero scope di variabili).

        Altre tecnologie che convertono java in qualche altra cosa, o che hanno limiti di memoria (chi ha detto android?) , potrebbero soffrire dello stesso comportamento. Ma oltre a GWT non saprei.

        Spero di aver aggiunto un pò di motivazioni! Per essere più chiaro devo per forza rimandare a come funziona JavaScript .

  • Marco

    Grande!!! Per i maniaci della pulizia è una manna dal cielo 🙂