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 .