Java 构造函数注入:如何减少参数的数量?

Java 构造函数注入:如何减少参数的数量?,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

我有一个服务类,它在构造函数中有7个参数。6个参数类型相同,但具有不同的限定符,第7个是其他服务。e、 g

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文件中指定,以便于更改。