これは私が現在設計しているものの単純化された例です。
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に例を追加する必要があります。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
必要ですが、 Example1コンストラクターの引数を削除できるかどうか疑問に思っているので、誰かがライブラリを使用している場合は、Exampleを作成するために呼び出す必要はありません。
私は次の解決策を考えています。これは初期化を非表示にするので、ライブラリを使用する人はメソッドを実装するだけで、例を)に追加すると自動的に初期化されます
。: Foo
Foo
manager.getFoo()
Foo
initialize(Foo)
Foo
ExampleManager
ExampleManager
add(Example)
public void add(Example e) {
e.initialize(foo);
examples.add(e);
}
でExample
、initialize(Foo foo); 抽象メソッドになるので、次のExample1
ようになります。
@Override
public void initialize(Foo foo) {
this.foo = foo;
}
これを行うためのより良い方法はありますか?