这是我目前正在设计的一个简单的例子。抽象初始化()方法而不是依赖注入,好的做法?
public class ExampleManager {
private Foo foo;
private ArrayList<Example> examples;
...
public ExampleManager() {
this.foo = new Foo();
this.examples = new ArrayList<Example>();
}
public void add(Example e) {
examples.add(e);
}
public void doSomethingWithExamples() {
for (int i = 0; i < examples.size(); i++) {
examples.get(i).doSomething();
}
}
...
}
public abstract class Example {
private Foo foo;
public Example(Foo foo) {
this.foo = foo;
}
...
}
为了使用图书馆,我必须扩展Example
类并添加实例到ExampleManager,这应该是修改Example
对象的唯一类。
所以我有这个Example1
类:
public class Example1 extends Example {
public Example1(Foo foo) {
super(foo);
}
...
}
和我目前初始化这样的管理者:
ExampleManager manager = new ExampleManager();
Example1 example1 = new Example1(manager.getFoo());
manager.add(example1);
我Example
需要Foo
对象,但我想知道如果我能摆脱Foo
参数在Example1构造函数中,因此如果有人使用该库,则不必调用manager.getFoo()
以创建示例。
我正在考虑以下解决方案,它将隐藏Foo
初始化,所以使用库的人只需实现initialize(Foo)
方法,并且在将示例添加到ExampleManager
时将自动初始化Foo
)
在ExampleManager
:改变add(Example)
方法:
public void add(Example e) {
e.initialize(foo);
examples.add(e);
}
在Example
,初始化(美孚FOO);将是一个抽象方法,所以在Example1
我想有这样的事情:
@Override
public void initialize(Foo foo) {
this.foo = foo;
}
有没有什么更好的方法来做到这一点?
我只瞥了一眼...可能是仿制药在这里有什么帮助吗? – Rekin
这看起来只是一种实现依赖注入的不同方式,而不是它的替代方法...? – Affe
不要重新发明轮子。为DI使用任何可用的框架。 –