У меня есть класс сервиса, который имеет 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, чтобы они были в одном состоянии (к сожалению, это класс библиотеки и не имеет конструктора).
public MyObjectInfoService(ObjectInfo[] objectInfoArray, DIfferentService diffService) {...}
или еще лучше
public MyObjectInfoService(Map<String, ObjectInfo> objectInfoMap, DIfferentService diffService) {...}
таким образом вы можете использовать ключи для захвата требуемых частей и ошибок при отсутствии.
Я могу утверждать, что вы заменяете полиморфизм квалификаторами.
Представьте себе вместо этого подклассу ObjectInfo
в более конкретные типы, основанные на определенных случаях использования. Тогда ваш "сервис" может стать тем, что многие вызовут в качестве MySpecificInformationController
для использования или MySpecificInformationController
контроллера, где MyObjectInfoService
исчезает в пользу MySpecificInformationController
который принимает объекты MySpecificInfo
внутри конструктора.
В качестве руководства принимайте не более трех параметров в конструкторе. Человеческий мозг взрывается выше этого, и код внутри класса заканчивается тем, что касается гораздо большего количества вещей, чем нужно. Субъективным это может быть, но исторические данные по этому вопросу довольно сильны.
MyObjectInfoService
и заменить 6 различными сервисами для каждого ObjectInfo?ObjectInfo
имеет смысла. В результате чего-то очень общего вы в конечном итоге создали их с квалификаторами, чтобы каким-то образом их разделить (именно здесь подклассы предназначены для устранения неоднозначности), и у вас есть универсальный сервис для обработки всех случаев, а не конкретные субклассовые сервисы, обрабатывающие подклассы ваших объектов. Я не знаю, что это за объектыObjectInfo
- может ли другой программист, пришедший в код, сразу понять, что происходит, или вам нужно что-то объяснить? Это хороший лакмусовый тест ...