Loading ...

Scrivere codice migliore in Java con Project Lombok

Scrivere codice migliore in Java con Project Lombok

Supponiamo di avere questo codice in Java (che sappiamo tutti essere un linguaggio abbastanza prolisso):

import java.util.Objects;

public class Persona {

    private int id;
    private String username;
    private int eta;

    public Persona(int id, String username, int eta) {
        this.id = id;
        this.username = username;
        this.eta = eta;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getEta() {
        return eta;
    }

    public void setEta(int eta) {
        this.eta = eta;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Persona persona = (Persona) o;
        return id == persona.id &&
                eta == persona.eta &&
                Objects.equals(username, persona.username);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, eta);
    }

    @Override
    public String toString() {
        return "Persona{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", eta=" + eta +
                '}';
    }

    public static class PersonBuilder {
        private int id;
        private String username;
        private int eta;

        public PersonBuilder setId(int id) {
            this.id = id;
            return this;
        }

        public PersonBuilder setUsername(String username) {
            this.username = username;
            return this;
        }

        public PersonBuilder setEta(int eta) {
            this.eta = eta;
            return this;
        }

        public Persona build() {
            return new Persona(id, username, eta);
        }
    }
}

E' vero che gli IDE ci aiutano a scriverlo, però capite bene che parliamo di 89 righe (in IntelliJ) per una semplice clase con tre campi + il pattern Builder!

Ho scoperto che esiste un tool che ci aiuta a scrivere un codice molto più compatto: Project Lombok!

La prima cosa da fare è aggiungere il plugin al vostro IDE; trovate le istruzioni nella sezione install.

Adesso aggiungete le dipendenze in Maven (se lo usate):

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>

In verità basterebbe Maven, nel senso che funzionava tutto lo stesso; ma senza il plugin, l'IDE mi dava un errore.

Questa la nostra classe, che fa esattamente la stessa cosa del codice sopra:

import lombok.*;

@Builder(toBuilder = true)
@ToString
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class PersonaLombok {
    @NonNull
    @Getter
    private int id;

    @NonNull
    @Getter
    private String username;

    @NonNull
    @Getter
    private int eta;
}

Questi gli esempi di come richiamiamo le due classi:

public class Main {
    public static void main(String args[]) {
        Persona p = new Persona.PersonBuilder()
                .setId(1)
                .setUsername("Mattepuffo")
                .setEta(33)
                .build();
        System.out.println(p);

        PersonaLombok pl = PersonaLombok.builder()
                .id(2)
                .username("Mattepuffo_Lombok")
                .eta(22)
                .build();
        System.out.println(pl);
    }

}

Questi i due output:

Persona{id=1, username='Mattepuffo', eta=33}
PersonaLombok(id=2, username=Mattepuffo_Lombok, eta=22)

Come vedete abbiamo ottenuto lo stesso risultato, ma con meno della metà del codice.

Sicuramente un tool da testare, perchè potrebbe veramente diminuire di parecchio il codice di un intero programma!

Enjoy!