Как я могу избежать написания многих очень похожих методов установки?

Я работаю над частью кода, где применяется следующее:

  1. Мне нужно создать множество подобных объектов в экземпляре класса A.
  2. Затем каждый из этих объектов получит свой собственный сеттер в классе 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();
    

Где все «что-то» наследуются от одного и того же класса.

  1. Сеттер ничего не делает, кроме:

    public void setSomethingX(somethingX){
    this.somethingX = somethingX; 
    }
    

Очень не хочется писать 23 сеттера, которые все делают почти одинаково. Есть ли что-то вроде многоцелевого сеттера?

Контекст этого — подготовка HTTP-ответа в очень конкретном контексте и с использованием некоторых очень специфических фреймворков. По-видимому, такой способ позволяет сэкономить много работы где-то еще (на что я не имею никакого влияния). Кроме того, как вы, вероятно, можете сказать, я начинающий разработчик.

Не уверен, что полностью понимаю контекст, но почему бы не использовать Map свойств?

Mena 27.05.2019 11:30

Вы можете поместить все в 1 метод, но это не цель метода установки. Eclipse может автоматически генерировать все методы настройки для вас.

XtremeBaumer 27.05.2019 11:31

Никто больше не пишет геттеры или сеттеры, а позволяет соответствующей IDE генерировать их;)

Smutje 27.05.2019 11:31

Несколько вариантов: (а) использовать вашу IDE для их автоматического создания (б) использовать Lombok (в) использовать другой язык (на ум приходит Kotlin — вы даже можете использовать Kotlin только для этих POJO и писать остальной код на Джава).

assylias 27.05.2019 11:32

Почему у вас 23 свойства в одном классе - это похоже на беспорядок.

Boris the Spider 27.05.2019 11:33

Чтобы расширить тему: если ваши разные дочерние классы X выполняют соответствующее специальное поведение, лучшим дизайном было бы вместо того, чтобы позволить вашему классу решать, что делать с каким объектом, изобретать абстрактный метод для X, который каждый класс реализует самостоятельно. Это было бы больше ООП, чем процедурное программирование.

Smutje 27.05.2019 11:33

зачем вообще использовать сеттеры? Если это просто объект-держатель данных, вы можете сделать поля public и напрямую присвоить значение. Или, что еще лучше, сделайте B неизменяемым (все поля окончательные + все значения, предоставленные через конструктор)

Lino 27.05.2019 11:34

Другой вариант — использовать такой инструмент, как MapStruct, для автоматического создания кода сопоставления.

Jesper 27.05.2019 11:40

использовать шаблон построителя

Dhruv Pal 27.05.2019 11:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы использовал для этого Ломбокский сеттер / геттер.

Одна аннотация, которая вызовет создание этих методов. Исходный код в вашей среде 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());

Другие вопросы по теме