【发布时间】:2012-11-13 20:36:32
【问题描述】:
这是我目前正在设计的一个简化示例。
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 对象,但是我想知道是否可以去掉 Example1 构造函数中的 Foo 参数,所以如果有人使用该库,不'不必调用 manager.getFoo() 来创建示例。
我正在考虑以下解决方案,它将隐藏Foo初始化,因此使用该库的人只需实现initialize(Foo)方法,并且Foo将在添加示例时自动初始化到ExampleManager)
在ExampleManager:将add(Example)方法更改为:
public void add(Example e) {
e.initialize(foo);
examples.add(e);
}
在Example,初始化(Foo foo);将是一个抽象方法,所以在Example1 我会有这样的东西:
@Override
public void initialize(Foo foo) {
this.foo = foo;
}
有没有更好的方法来做到这一点?
【问题讨论】:
-
我只是浏览了一下...泛型在这里有什么帮助吗?
-
这看起来只是实现依赖注入的一种不同方式,而不是它的替代方案......?
-
不要重新发明轮子。为 DI 使用任何可用的框架。
-
@Rekin 我认为这里不需要泛型。
标签: java oop dependency-injection initialization abstract-class