疎結合な実装方法を探しているようですので、DI(※Dependency Injection)について説明します。
※どのタイミングで共有する値が変わるのか、によって実装は変わってきます。もしも保存時だけ…というのであれば、リポジトリに共有するための機能を追加していきます。
Dependency Injectionとは、依存性を外から注入する…という意味です。masuoさんの例の場合は、「値を共有するためのオブジェクトを渡してあげる」ということです。この利点は、DのスコープによってABCクラスで共有する値のスコープも変えることができることです。
例えば、常に値が共有され続けるならばクラスDはシングルトンにすればいいでしょう。とあるシーン(画面中)でのみ同じという場合にはその都度生成し、ABCのインスタンス化時に同じDインスタンスを渡します。
疎結合を保て、利用すべきシナリオに合わせて共有方法が変えられるというのがDIのメリットです。デメリットとしては、Dの取得元(インスタンス化方法)を参照することでしか共有方法が分からないことや、コーディング量が増えてしまうというのがあり、最初の方は使いこなすまでに慣れがいると思います。
public class A
{
private D d;
public A(D d)
{
this.d = d;
}
public setValue(int value)
{
d.setValue(value);
}
public getValue()
{
return d.getValue();
}
}
// 他のBCについて同様、Dはvalueプロパティを持つだけのbeanみたいなものです(この例では)
public class B;
public class C;
// ファクトリを作らなければならないわけではないです、説明用
// ※これは手抜き実装ですが、シナリオによっては十分な実装にもなりえます。
public class ABCFactory
{
// このdの寿命でABCのデータの共有のされ方が決まる。
// 例えばDがシングルトンなら、全てのABCで常に値が共有される。
private static D d;
private static D getD()
{
if (d == null)
{
d = new D();
}
return d;
}
public static A createA()
{
return new A(getD());
}
// B & C も同様
}
上記Factoryは固定で書かれており、柔軟とは言えませんが…DIコンテナという、上記のFactoryをより柔軟に実装するためのツールがあります。ただDIそのものは慣れるまで使うのが結構大変です。アイディアだけ盗むのが最初は良いんじゃないかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。