Внедрение в конструктор: как уменьшить количество параметров?

1

У меня есть класс сервиса, который имеет 7 параметров в конструкторе. 6 имеют один и тот же тип, но с разными квалификаторами, а 7-я - другая. например

public class MyObjectInfoService {
...
   @Autowired
   public MyObjectInfoService(@Qualifier("firstObjectInfo") ObjectInfo firstObjectInfo,
                            @Qualifier("secondObjectInfo") ObjectInfo secondObjectInfo,
                            ...
                            @Qualifier("sixthObjectInfo") ObjectInfo sixtObjectInfo,
                            DifferentService differentService) { 
        //code here 
   }
...
}

Есть ли способ сократить его - имея меньше параметров?

ObjectInfos указываются в файле контекста. например

<bean id="firstObjectInfo" parent="abstractObjectInfo">
   <property name="firstProp" value="Some value"/>
   <property name="secondProp" value="Some value"/>
</bean>

Класс MyObjectInfoService имеет методы для каждого объекта ObjectInfo, где каждый метод обрабатывает некоторую логику, а затем вызывает метод differentService с определенным аргументом objectInfo в качестве аргумента.

В будущем может быть больше ObjectInfos.

Единственное решение, которое я вижу, - это удалить все зависимости ObjectInfo от конструктора и вручную инициализировать ObjectInfo во всех методах и вызывать объекты objectInfo, чтобы они были в одном состоянии (к сожалению, это класс библиотеки и не имеет конструктора).

Теги:
spring
dependency-injection

2 ответа

1
Лучший ответ
public MyObjectInfoService(ObjectInfo[] objectInfoArray, DIfferentService diffService) {...}

или еще лучше

public MyObjectInfoService(Map<String, ObjectInfo> objectInfoMap, DIfferentService diffService) {...}

таким образом вы можете использовать ключи для захвата требуемых частей и ошибок при отсутствии.

0

Я могу утверждать, что вы заменяете полиморфизм квалификаторами.

Представьте себе вместо этого подклассу ObjectInfo в более конкретные типы, основанные на определенных случаях использования. Тогда ваш "сервис" может стать тем, что многие вызовут в качестве MySpecificInformationController для использования или MySpecificInformationController контроллера, где MyObjectInfoService исчезает в пользу MySpecificInformationController который принимает объекты MySpecificInfo внутри конструктора.

В качестве руководства принимайте не более трех параметров в конструкторе. Человеческий мозг взрывается выше этого, и код внутри класса заканчивается тем, что касается гораздо большего количества вещей, чем нужно. Субъективным это может быть, но исторические данные по этому вопросу довольно сильны.

  • 0
    Извините, я не понял вас. Вы предлагаете удалить MyObjectInfoService и заменить 6 различными сервисами для каждого ObjectInfo?
  • 0
    Я полагаю, что ObjectInfo имеет смысла. В результате чего-то очень общего вы в конечном итоге создали их с квалификаторами, чтобы каким-то образом их разделить (именно здесь подклассы предназначены для устранения неоднозначности), и у вас есть универсальный сервис для обработки всех случаев, а не конкретные субклассовые сервисы, обрабатывающие подклассы ваших объектов. Я не знаю, что это за объекты ObjectInfo - может ли другой программист, пришедший в код, сразу понять, что происходит, или вам нужно что-то объяснить? Это хороший лакмусовый тест ...
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню