Lombok Builder с пользовательским сеттером
1. Вступление
Project Lombok - популярная библиотека Java, помогающая сократить объем шаблонного кода, который необходимо написать разработчику.
В этом руководстве мы рассмотрим, как работает аннотация@Builder в Lombok и как мы можем настроить ее для наших конкретных нужд.
2. Maven Dependency
Начнем с добавленияthe dependency к нашемуpom.xml:
org.projectlombok
lombok
1.18.2
3. LombokBuilder Аннотация
Прежде чем приступить к настройке сгенерированного класса построителя Lombok, давайте кратко рассмотрим, как работает аннотация Lombok@Builder. У нас уже есть полныйintroduction into Lombok’s features.
The @Builder annotation can be used to automatically generate a builder for our class. В нашем примере мы будем использовать систему обмена сообщениями, в которой один пользователь может отправить сообщение другому пользователю. Сообщение представляет собой простую текстовую строку илиFile. Используя 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("[email protected]")
.recipient("[email protected]")
.text("How are you today?")
.build();
Аннотация@Builder также поддерживает значения по умолчанию для атрибутов, но мы не будем углубляться в это сейчас. Из этого примера должно быть ясно, что аннотация@Builder довольно мощная и может заменить большую часть шаблонного кода.
4. Настройка строителей Lombok
В предыдущем разделе показано, как мы можем использовать Lombok для генерации класса построителя. Но могут быть случаи, когда сгенерированного компоновщика недостаточно. В нашем примере у нас есть ограничение на то, что сообщение может содержать только текст или файл. Это не может иметь оба. Ломбок, конечно, не знает этого, и сгенерированный строитель с радостью позволит нам попасть в это незаконное состояние.
К счастью, мы можем решить эту проблему, настроив застройщика.
Настроить конструктор Lombok просто и понятно:we write the parts of the builder that we want to customize and the Lombok @Builder annotation will simply not generate those parts. Итак, в нашем примере это будет:
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'.");
}
}
}
Обратите внимание, что нам не нужно было объявлять элементыsender иrecipient или связанные с ними методы построения. Ломбок все еще будет генерировать их для нас.
Если мы попытаемся сгенерировать экземплярMessage как с текстом, так и с файлом со следующим кодом:
Message message = Message.builder()
.sender("[email protected]")
.recipient("[email protected]")
.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.
Как всегда доступен кодover on GitHub.