gpt4 book ai didi

java - 抽象初始化()方法而不是依赖注入(inject),好的做法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:13 26 4
gpt4 key购买 nike

这是我目前正在设计的东西的简化示例。

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() 来创建一个 Example。
我正在考虑以下解决方案,它将隐藏 Foo 初始化,因此使用该库的人只需实现 initialize(Foo) 方法,并且 Foo 将在将示例添加到 ExampleManager 时自动初始化)
ExampleManager 中:更改 add(Example) 方法:

public void add(Example e) {
e.initialize(foo);
examples.add(e);
}

例子中,初始化(Foo foo);将是一个抽象方法,所以在 Example1 中我会有这样的东西:

@Override
public void initialize(Foo foo) {
this.foo = foo;
}

有更好的方法吗?

最佳答案

在我看来,如果您需要像您描述的那样传递对象,那么您的 OO 模型首先就存在一些问题。 - 或者您的示例代码可能没有揭示事情的真正意义。

特别是

ExampleManager [...] should be the only class that modifies the Foo objects

Example needs the Foo object

看起来有点“特别”。

您能否详细说明 ExampleManagerFoo 实例之间以及 ExampleFoo< 之间的交互是什么?/实例?

好的,关于你的评论,我建议观察者模式,很像你的 initialize() 方法:

public abstract class Example {
protected Foo callbackHandler;

public void setCallbackHandler( Foo handler ) {
this.callbackHandler = handler;
}

protected void doCallback( SomeType event ) {
if ( this.callbackHandler != null ) {
this.callbackHandler.doYourThing( event );
}
}
}

并让 ExampleManager 将自己或其 Foo 实例注册为回调处理程序,当一个对象被添加到它时。非抽象子类将只需要调用 doCallback(...) ,只要他们想交流一些东西,而不必处理回调的任何设置。

关于java - 抽象初始化()方法而不是依赖注入(inject),好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com