Перейти к основному содержимому

Lombok Builder с пользовательским сеттером

· 3 мин. чтения

1. Введение

Project Lombok — это популярная библиотека Java, помогающая сократить объем стандартного кода, который необходимо написать разработчику.

В этом уроке мы рассмотрим, как работает аннотация Lombok @Builder и как мы можем настроить ее для наших конкретных нужд.

2. Зависимость от Maven

Давайте начнем с добавления зависимости в наш pom.xml :

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>

3. Аннотация Lombok Builder

Прежде чем мы рассмотрим настройку сгенерированного класса построителя Lombok, давайте кратко рассмотрим, как работает аннотация Lombok @Builder . У нас уже есть полное представление о функциях Ломбока.

Аннотацию @Builder можно использовать для автоматической генерации построителя для нашего класса . В нашем примере мы будем использовать систему обмена сообщениями, в которой один пользователь может отправить сообщение другому пользователю. Сообщение представляет собой либо простую текстовую строку, либо файл . Используя Lombok, мы можем определить наш класс Message следующим образом:

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

@Data генерирует весь шаблон, который обычно ассоциируется с простым POJO (обычный старый объект Java): геттеры для всех полей, сеттеры для всех полей, не являющихся конечными, и соответствующие реализации toString , equals и hashCode , а также конструктор.

Используя сгенерированный построитель, теперь мы можем генерировать экземпляры нашего класса Message :

Message message = Message.builder()
.sender("user@somedomain.com")
.recipient("someuser@otherdomain.com")
.text("How are you today?")
.build();

Аннотация @Builder также поддерживает значения по умолчанию для атрибутов, но мы не будем сейчас вдаваться в подробности . Из этого примера должно быть ясно, что аннотация @Builder довольно эффективна и может заменить большую часть шаблонного кода.

4. Настройка Lombok Builders

В предыдущем разделе было показано, как мы можем использовать Lombok для создания класса построителя. Но могут быть случаи, когда сгенерированного билдера недостаточно. В нашем примере у нас есть ограничение, что сообщение может содержать только текст или файл. Не может быть и того, и другого. Ломбок, конечно же, этого не знает, и сгенерированный билдер с радостью позволит нам попасть в это недопустимое состояние.

К счастью, мы можем решить эту проблему, настроив конструктор.

Настройка билдера Lombok проста и понятна: мы пишем те части билдера, которые хотим настроить, и аннотация Lombok @Builder просто не сгенерирует эти части . Итак, в нашем примере это будет:

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'.");
}
}
}

Обратите внимание, что нам не нужно было объявлять членов- отправителей и получателей или связанные с ними методы построения. Ломбок по-прежнему будет генерировать их для нас.

Если мы попытаемся сгенерировать экземпляр Message с текстом и файлом со следующим кодом:

Message message = Message.builder()
.sender("user@somedomain.com")
.recipient("someuser@otherdomain.com")
.text("How are you today?")
.file(new File("/path/to/file"))
.build();

Это приведет к следующему исключению:

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

5. Вывод

В этой быстрой статье мы рассмотрели, как настроить конструктор Lombok.

Как всегда, код доступен на GitHub .