2012-01-13 9 views
1

私は多くの異なるシミュレーションを実行するコードを書いており、それぞれ独自のSimulationオブジェクトにあります。 Simulationから結果を抽出するには、まずSimulationReportSimulationの子の1つ)のインスタンスを作成するように依頼する必要があります。シミュレーションのインスタンスごとに1つのレポートインスタンス:シングルトンを使用しますか?

Simulationは、多くの場合Reportを含めることもできますが、作成プロセスは非常に高価なので、すでにその特定のSimulationReportがあれば、私はそれを再利用ではなく、新しいものを作成したいです。

Reportのインスタンスは、私のコードでは多くの異なるクラスからアクセスされます。私は最初にReportが既にその特定のSimulationに存在するかどうかをチェックし、それに基づいて既存のものを取得するか、新しいものを作成するコードを複製しないようにしたいと思います。 「シングルトン」のようなものを作る

  1. :私は2つの道を見る種類のシングルトンのような...

    -

    私は本当に唯一ReportSimulationあたりの1つのインスタンスがあるようにしたいですReportSimulationごとに作成することができます。これは可能ですか?

  2. Simulationを拡張SpecialSimulationクラスを作り、そしてSpecialSimulationではReportが含まれているシングルトンが含まれます。これは過剰ですか?

SimulationReportは、私たちはのライセンスを持っている商業用のJava APIからです。ソースコードを変更することはできません。 ... JavaとOOPのロープを学ぶために

+2

シングルトンの必要がない 'SpecialSimulation'のコンストラクタで' Report'を開始することができます – fge

+0

SimulationとReportを変更することはできませんし、API docも持っていないので、答えるのは難しいです。しかし、Javaでオブジェクトを作成するのはコストがかかりません。私は、レポートを生成するのに費用がかかるのは、オブジェクトを作成するのではなく、適切な値で埋めていくことだと思います。レポートに新しい値を設定する必要があるたびに、同じインスタンスを再利用するか、新しいインスタンスを作成しても何も変更されません。 –

答えて

2

を自分のベストを尽くして

私が正しくあなたの質問を理解していれば、あなたが本当にちょうどこのような何かをしたい:

public class ReportManager { 
    final static ConcurrentMap<Simulation, Report> reports = new ConcurrentHashMap<Simulation, Report>(); 

    public static Report getReportForSimulation(final Simulation simulation){ 
     if (!reports.containsKey(simulation)) reports.putIfAbsent(simulation, simulation.getReport()); 
     return reports.get(simulation); 
    } 
} 

その後ReportManagerを使用レポートを取得します。肯定的な面では、非常に単純ですが、理論的には、マルチスレッド環境でレポートが複数回生成される可能性がありますが、まれに発生する可能性があり、少なくともすべてのスレッドが、同じレポート

関連する問題