Настройте супер строитель ломбока - PullRequest
2 голосов
/ 07 мая 2020

У меня есть родительский абстрактный класс «Parent» и дочерний класс «Child». Я использую @SuperBuilder для создания API-интерфейсов построителя. Теперь я хочу выполнить некоторые проверки членов классов «Parent» и «Child» в рамках сборки. Я не мог найти никакого решения для настройки супер-строителя ломбока. По lombok do c вроде бы возможно. Может кто-нибудь пролить свет?

@SuperBuilder
public abstract class Parent {
    int x;
    int y;
    int z;
    int a;
}

@SuperBuilder
public abstract class Child extends Parent {
    int b;
    int c;
    int d;

    // I want something like
    public static class ChildBuilder {

       public Child build() {
           Child child = // Get child somehow;
           validate(child);
       }
    }
}

1 Ответ

2 голосов
/ 08 мая 2020

Сгенерированный код для @SuperBuilder сложен и загружен с параметрами типа. Поэтому рекомендуется delombok ваш класс и использовать вывод как ссылку.

Вы можете сделать это с помощью этой команды:

java -jar path/to/lombok.jar delombok -p path/to/src/main/java/Child.java

Результат покажет, какой код генерирует ломбок . Я предполагаю, что класс Child не является абстрактным (думаю, у вас есть опечатка в ваших вопросах). Вы хотите настроить метод build(), поэтому вас интересует ChildBuilderImpl, потому что этот класс содержит этот метод. Вы можете скопировать заголовок класса в исходный файл и добавить свой собственный метод build():

private static final class ChildBuilderImpl extends Child.ChildBuilder<Child, Child.ChildBuilderImpl> {
    @java.lang.Override
    public Child build() {
        // Do validation here, e.g.:
        if (((Child.ChildBuilder<?, ?>)this).b == 0)
            throw new IllegalArgumentException("b must not be 0");
        return new Child(this);
    }
}

Примечание: я бы предпочел выполнить проверку в конструкторе, потому что в противном случае вы могли бы программно вызвать конструктор без значения проверяются. Однако в настоящее время настройка конструктора @SuperBuilder невозможна; это будет возможно со следующим выпуском ломбока. Я обновлю этот вопрос, когда он будет выпущен.

...