Java 构造函数注入:如何减少参数的数量?
我有一个服务类,它在构造函数中有7个参数。6个参数类型相同,但具有不同的限定符,第7个是其他服务。e、 gJava 构造函数注入:如何减少参数的数量?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有一个服务类,它在构造函数中有7个参数。6个参数类型相同,但具有不同的限定符,第7个是其他服务。e、 g public class MyObjectInfoService { ... @Autowired public MyObjectInfoService(@Qualifier("firstObjectInfo") ObjectInfo firstObjectInfo, @Qualifier("secondObjectInf
public class MyObjectInfoService {
...
@Autowired
public MyObjectInfoService(@Qualifier("firstObjectInfo") ObjectInfo firstObjectInfo,
@Qualifier("secondObjectInfo") ObjectInfo secondObjectInfo,
...
@Qualifier("sixthObjectInfo") ObjectInfo sixtObjectInfo,
DifferentService differentService) {
//code here
}
...
}
有没有办法缩短它-参数更少
ObjectInfo在上下文文件中指定。e、 g
<bean id="firstObjectInfo" parent="abstractObjectInfo">
<property name="firstProp" value="Some value"/>
<property name="secondProp" value="Some value"/>
</bean>
MyObjectInfo服务类具有用于每个ObjectInfo的方法,其中每个方法处理一些逻辑,然后使用特定ObjectInfo作为参数调用不同服务的方法
将来可能会有更多的ObjectInfo
我看到的唯一解决方案是从构造函数中删除所有ObjectInfo依赖项,在每个方法中手动初始化ObjectInfo,并调用ObjectInfo的setter使其处于相同的状态(不幸的是,它是一个库类,没有构造函数)
或者更好
public MyObjectInfoService(Map<String, ObjectInfo> objectInfoMap, DIfferentService diffService) {...}
publicMyObjectInfo服务(映射ObjectInfo映射,不同服务区分){…}
这样,您就可以使用键获取所需的部分,并在任何缺少的部分上出错。我可能认为您正在用限定符替换多态性 想象一下,根据确定的用例,将您的
ObjectInfo
子类化为更具体的类型。然后,您的“服务”可能会成为许多人所称的用例交互器或用例控制器,其中myObjectInfo服务
消失,取而代之的是mySpecificationFormationController
,它接受构造函数中的mySpecificationInfo
对象
public MyObjectInfoService(ObjectInfo[] objectInfoArray, DIfferentService diffService) {...}
作为指导,在构造函数中接受的参数不得超过三个。人类的大脑爆炸不止于此,类中的代码最终会接触到远远超出需要的东西。这可能是主观的,但这方面的历史证据相当充分。对不起,我可能不理解你的意思。您建议删除
myObjectInfo服务
并为每个ObjectInfo替换6个不同的服务?我建议ObjectInfo
毫无意义。由于某种非常通用的东西,您最终创建了它们,并使用限定符以某种方式将它们分开(这就是子类化旨在消除歧义的地方),并且您有一个通用服务来处理所有情况,而不是处理对象子类的特定子类化服务。我不知道这些ObjectInfo
对象是什么-另一个程序员会立即理解正在发生的事情吗,或者你需要解释一下吗?这是一个很好的试金石测试…问题是每个ObjectInfo
都包含在applicationContext.xml
中指定的唯一预填充数据。因此,要么将它们指定为bean,要么在代码中使用硬编码字符串或使用propertyplaceholderconfigure
或其他方法手动实例化它们。这就是为什么我为每个ObjectInfo
创建了单独的bean。这听起来很像是隐藏在一个名为ObjectInfo
的类中的配置数据。每个对象都包含一个字段,如头和文件名,其中“父”bean包含一些布尔值和服务器地址值。对象信息意味着向其他服务器发送数据。这些值在xml文件中指定,以便于更改。