Базовый экземпляр Common Builder для иерархии классов с использованием LombokJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Базовый экземпляр Common Builder для иерархии классов с использованием Lombok

Сообщение Anonymous »

У меня есть иерархия классов с одним абстрактным базовым классом и несколькими дочерними классами. Базовый класс имеет ~25 полей, и каждый дочерний класс имеет дополнительные поля с числом от 0 до 8.

Я хотел бы использовать шаблон Builder для создания каждого дочернего экземпляра, и я Мне бы хотелось использовать Lombok как можно чаще, чтобы код был кратким. Следуя этому предложению, у меня есть код, показанный ниже:

Код: Выделить всё

@AllArgsConstructor
@Data
public abstract class Base {
private int b1, b2, ... , b25;
}

public class C1 extends Base {
private int c11, c12, ... , c16;

@Builder
private C1(int b1, int b2, ..., int b25, int c11, ... int c16) {
super(b1, b2, ...., b25);
this.c11 = c11;
...
this.c16 = c16;
}
}

public class C2 extends Base {

@Builder
private C2(int b1, int b2, ..., int b25) {
super(b1, b2, ...., b25);
}
}
Это упрощает создание дочерних классов как

Код: Выделить всё

C1 c1 = C1.builder().b1(1).b2(2)....b25(25).c11(101).c12(102).build();
C2 c2 = C2.builder().b1(1).b2(2)....b25(25).build();
Проблема в том, что связанные вызовы .b1().b2()... повторяются каждый раз, когда создается какой-либо дочерний класс.

Проблема в том, что связанные вызовы .b1().b2()... повторяются каждый раз, когда создается какой-либо дочерний класс.

Проблема в том, что цепочки вызовов .b1().b2()... повторяются каждый раз, когда создается какой-либо дочерний класс.

Проблема в том, что цепочки вызовов .b1().b2()... повторяются каждый раз.

Проблема в том, что связанные вызовы .b1().b2()... повторяются каждый раз, когда создается какой-либо дочерний класс.

Проблема в том, что цепочки вызовов .b1().b2()... повторяются.

p>

В идеале мне нужен общий способ установки значений B независимо от того, какой дочерний класс создается. (Предположим, что существует другой класс под названием BValuesProvider, который может предоставлять эти значения)

Код: Выделить всё

public void setBValues(BValuesProvider bv, // what else goes here??? //) {
// something.b1(bv.b1()).b2(bv.b2()) ...
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
C1.Builder c1b = C1.builder().c11(c11).c12(c12)....c16(c16);
// Call setBValues somehow
return c1b.build();
}

public createC2(BValuesProvider bv) {
// Call setBValues somehow
return c2b.build();
}
Мое текущее решение заключалось в том, чтобы прикрепить аннотацию @Data к базовому классу, чтобы предоставить доступ к сеттерам/геттерам, поэтому мой код выглядит следующим образом:

Код: Выделить всё

public void setBValues(BValuesProvider bv, Base cx) {
cx.setB1(bv.b1());
cx.setB2(bv.b2());
...
cx.setB25(bv.b25());
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
C1 c1 = C1.builder().c11(c11).c12(c12)....c16(c16).build();
setBValues(bv, c1);
return c1;
}

public createC2(BValuesProvider bv) {
C2 c2 = C2.builder().build();
setBValues(bv, c2);
return c2;
}
Вопросы:
  • Есть ли лучший способ сделать это ? В частности, я считаю, что сначала создавать дочерний класс (полностью), а затем вызывать для него функции setBxx(), кажется плохим шаблоном. Открытие самих сеттеров делает класс весьма изменчивым.
  • На SO были и другие вопросы о сборщиках/наследовании


    Шаблон и наследование Builder
  • Создание подкласса класса Java Builder
  • как вызвать суперконструктор в Lombok< /li>
Однако никто из них не говорит о наличии «базового строителя», подклассом которого является каждый дочерний
строитель. Итак, я не могу с помощью дженериков понять,
каким должен быть второй аргумент функции setBValues.
[*]Я также попробовал @ Lombok. Superbuilder, но, опять же, хотя это значительно упрощает код, я все еще не понимаю, как получить базовый конструктор.


Подробнее здесь: https://stackoverflow.com/questions/574 ... ing-lombok
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»