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

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.