Я работаю над частью кода, где применяется следующее:
Затем каждый из этих объектов получит свой собственный сеттер в классе B, который соответствует 1:1 объектам, созданным в экземпляре класса A. то есть В классе А:
B b = new B();
final SomethingA somethingA1 = new SomethingA("input1");
b.setSomethingA();
...
final SomethingB somethingB15 = new SomethingB("input15");
b.setSomethingB15();
...
final SomethingA somethingA23 = new SomethingA("input23");
b.setSomethingA23();
Где все «что-то» наследуются от одного и того же класса.
Сеттер ничего не делает, кроме:
public void setSomethingX(somethingX){
this.somethingX = somethingX;
}
Очень не хочется писать 23 сеттера, которые все делают почти одинаково. Есть ли что-то вроде многоцелевого сеттера?
Контекст этого — подготовка HTTP-ответа в очень конкретном контексте и с использованием некоторых очень специфических фреймворков. По-видимому, такой способ позволяет сэкономить много работы где-то еще (на что я не имею никакого влияния). Кроме того, как вы, вероятно, можете сказать, я начинающий разработчик.
Вы можете поместить все в 1 метод, но это не цель метода установки. Eclipse может автоматически генерировать все методы настройки для вас.
Никто больше не пишет геттеры или сеттеры, а позволяет соответствующей IDE генерировать их;)
Несколько вариантов: (а) использовать вашу IDE для их автоматического создания (б) использовать Lombok (в) использовать другой язык (на ум приходит Kotlin — вы даже можете использовать Kotlin только для этих POJO и писать остальной код на Джава).
Почему у вас 23 свойства в одном классе - это похоже на беспорядок.
Чтобы расширить тему: если ваши разные дочерние классы X выполняют соответствующее специальное поведение, лучшим дизайном было бы вместо того, чтобы позволить вашему классу решать, что делать с каким объектом, изобретать абстрактный метод для X
, который каждый класс реализует самостоятельно. Это было бы больше ООП, чем процедурное программирование.
зачем вообще использовать сеттеры? Если это просто объект-держатель данных, вы можете сделать поля public
и напрямую присвоить значение. Или, что еще лучше, сделайте B
неизменяемым (все поля окончательные + все значения, предоставленные через конструктор)
Другой вариант — использовать такой инструмент, как MapStruct, для автоматического создания кода сопоставления.
использовать шаблон построителя
Я бы использовал для этого Ломбокский сеттер / геттер.
Одна аннотация, которая вызовет создание этих методов. Исходный код в вашей среде IDE не будет загрязнен этими сеттерами, и его будет намного легче читать.
Существует предложение для классов данных, но он еще не реализован.
Есть пара методов для уменьшения сеттеров:
1) Создать конструктор с B в качестве параметра
class A {
private B b;
public A(B b) {
this.b = b;
}
}
A a = new A(new B());
2) Используйте шаблон строителя (с ломбоком будет легко реализовать):
@Builder // lombok annotation
class A {
private B b;
}
A a = A.builder().withB(b).build();
3) Использовать заводской метод:
class A {
private B b;
public static A newInstance(B b) {
A a = new A();
a.b = b;
return a;
}
}
A a = A.newInstance(new B());
Не уверен, что полностью понимаю контекст, но почему бы не использовать
Map
свойств?