【发布时间】:2016-01-02 22:34:05
【问题描述】:
我在 Guice 中有一个类,它使用依赖注入在构造函数中获取 ~10 个参数。
这个类有很多派生类。 所有派生类的构造函数只是将所有参数传递给super。
向基类的构造函数添加新参数需要将此参数添加到所有派生类的所有构造函数。
class MyBaseClass {
@Inject
MyBaseClass(arg1,arg2,arg3, ..., argn) {
this.arg1 = arg1
....
}
}
class MyDerivedClass1 extends MyBaseClass{
@Inject
MyDerivedClass1(arg1,arg2,arg3, ..., argn) {
super(arg1,arg2,arg3, ..., argn)
}
}
class MyDerivedClass2 extends MyBaseClass{
@Inject
MyDerivedClass2(arg1,arg2,arg3, ..., argn) {
super(arg1,arg2,arg3, ..., argn)
}
}
我的一个解决方案是将所有参数包装在一个类中,并将该类注入基类和所有派生类。这样,当向注入的类添加新参数时,它将被注入到所有派生类。
类似:
class MyBaseClassSettings {
@Inject
MyBaseClassSettings(arg1,arg2,arg3, ..., argn) {
this.arg1 = arg1
...
}
}
class MyBaseClass {
@Inject
MyBaseClass(MyBaseClassSettings settings) {
this.settings = settings;
}
}
class MyDerivedClass1 extends MyBaseClass{
@Inject
MyDerivedClass1(MyBaseClassSettings settings) {
super(settings)
}
}
class MyDerivedClass2 extends MyBaseClass{
@Inject
MyDerivedClass2(MyBaseClassSettings settings) {
super(settings)
}
}
假设 args 彼此并不真正相关(一个是与数据库的连接,另一个是为任务分配线程的助手,另一个负责部分实际逻辑,另一个负责地理配置班级...(只是示例))这个解决方案是否可以考虑?
如果是这样,包装类的好命名是什么?
【问题讨论】:
-
虽然这种方法没问题,但您应该检查所有这些 args 参数是否没有任何共同点......也许您发现您可以派生“数据库设置”而不是“设置”, “用户设置”,...并使用多个有意义的包装器。
标签: java inheritance constructor dependency-injection guice