我编写的代码运行了许多不同的模拟,每个模拟都在自己的Simulation
对象中。要从Simulation
中提取结果,我们首先要求Simulation
创建Report
的实例(作为Simulation
个孩子之一)。
即使Simulation
可以包含多个实例Report
,创建过程也非常昂贵,所以如果特定Report
中已经存在Simulation
,我想要重新使用它而不是创建一个新的。
我的代码中的许多不同类都可以访问Report
个实例。我想避免复制首先检查特定Report
中是否已存在Simulation
的代码,然后根据该代码获取现有代码或创建新代码。
我真的只希望每个Report
有一个Simulation
个实例 - 有点像单身......
我看到两个途径:
创建一种“单例”报表类,允许每Report
个创建不超过Simulation
个SpecialSimulation
。这可能吗?
制作一个Simulation
类扩展SpecialSimulation
,Report
包含一个包含Simulation
的单例。这有点过头了吗?
Report
和{{1}}来自我们拥有许可证的商业Java API;我无法修改他们的源代码。
尽我所能学习Java和OOP的绳索......
答案 0 :(得分: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检索报告。从积极的方面来看,它非常简单,但从消极方面来看,理论上可能会导致报告在多线程环境中多次生成,但这种情况很少发生,并且您可以保证在至少所有线程都看到完全相同的报告