Lombok Builder con setter personalizzato

1. Introduzione

Project Lombok è una popolare libreria Java che aiuta a ridurre la quantità di codice boilerplate che uno sviluppatore deve scrivere.

In questo tutorial, daremo un'occhiata a come funziona l' annotazione @Builder di Lombok e come possiamo personalizzarla per le nostre esigenze specifiche.

2. Dipendenza da Maven

Cominciamo aggiungendo la dipendenza al nostro pom.xml :

 org.projectlombok lombok 1.18.10 

3. Annotazione di Lombok Builder

Prima di esaminare la personalizzazione della classe builder generata da Lombok, facciamo un breve riepilogo di come funziona l' annotazione Lombok @Builder . Abbiamo già un'introduzione completa alle funzionalità di Lombok.

L' annotazione @Builder può essere utilizzata per generare automaticamente un builder per la nostra classe . Per il nostro esempio, utilizzeremo un sistema di messaggistica in cui un utente può inviare un messaggio a un altro utente. Il messaggio è una semplice stringa di testo o un file . Usando Lombok, possiamo definire la nostra classe Message come segue:

@Builder @Data public class Message { private String sender; private String recipient; private String text; private File file; }

@Data genera tutto il boilerplate che è normalmente associato a un semplice POJO (Plain Old Java Object): getter per tutti i campi, setter per tutti i campi non finali e appropriate implementazioni toString , uguale e hashCode e un costruttore.

Utilizzando il builder generato, ora possiamo generare istanze della nostra classe Message :

Message message = Message.builder() .sender("[email protected]") .recipient("[email protected]") .text("How are you today?") .build();

L' annotazione @Builder supporta anche i valori predefiniti per gli attributi, ma non ne parleremo ora. Dovrebbe essere chiaro da questo esempio che l' annotazione @Builder è abbastanza potente e può sostituire molto codice boilerplate.

4. Personalizzazione di Lombok Builders

La sezione precedente ha mostrato come possiamo usare Lombok per generare una classe builder. Ma ci possono essere casi in cui il builder generato non è sufficiente. Nel nostro esempio, abbiamo un vincolo che il messaggio può contenere solo testo o un file. Non può avere entrambi. Lombok non lo sa, ovviamente, e il costruttore generato ci permetterà felicemente di entrare in quello stato illegale.

Fortunatamente possiamo affrontare questo problema personalizzando il builder.

La personalizzazione di un generatore Lombok è semplice e diretta: scriviamo le parti del generatore che vogliamo personalizzare e l' annotazione Lombok @Builder semplicemente non genererà quelle parti . Quindi nel nostro esempio, sarebbe:

public static class MessageBuilder { private String text; private File file; public MessageBuilder text(String text) { this.text = text; verifyTextOrFile(); return this; } public MessageBuilder file(File file) { this.file = file; verifyTextOrFile(); return this; } private void verifyTextOrFile() { if (text != null && file != null) { throw new IllegalStateException("Cannot send 'text' and 'file'."); } } }

Tieni presente che non dovevamo dichiarare i membri del mittente e del destinatario , né i metodi del builder ad essi associati. Lombok continuerà a generarli per noi.

Se proviamo a generare un'istanza Message con testo e un file con il codice seguente:

Message message = Message.builder() .sender("[email protected]") .recipient("[email protected]") .text("How are you today?") .file(new File("/path/to/file")) .build();

Risulterà nella seguente eccezione:

Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'.

5. conclusione

In questo rapido articolo, abbiamo esaminato come personalizzare il generatore Lombok.

Come sempre, il codice è disponibile su GitHub.