Один экземпляр отчета на экземпляр имитации: использовать синглтон? - PullRequest
1 голос
/ 13 января 2012

Я написал код, который запускает много разных симуляций, каждый в своем собственном Simulation объекте.Чтобы извлечь результаты из Simulation, сначала нужно попросить Simulation создать экземпляр Report (как один из потомков Simulation).

Хотя Simulation может содержать много экземпляров Report, процесс создания довольно дорогой, поэтому, если в этом конкретном Simulation уже есть Report, я хочу использовать его повторно.а не создавать новый.

Доступ к экземплярам Report осуществляется из разных классов в моем коде.Я хотел бы избежать репликации кода, который сначала проверяет, существует ли уже Report в этом конкретном Simulation, а затем на основе этого либо получить существующий, либо создать новый.

Я действительно хочу, чтобы был только один экземпляр Report на Simulation - вроде как синглтон ...

Я вижу два пути:

  1. Создание своего рода «одиночного» класса отчета, который позволяет создавать не более одного Report на Simulation.Возможно ли это?

  2. Создание класса SpecialSimulation, который расширяет Simulation, а в SpecialSimulation включает синглтон, который содержит Report.Является ли это излишним?

Simulation и Report из коммерческого Java API, на который у нас есть лицензия;Я не могу изменить их исходный код.

Делать все возможное, чтобы изучить веревки Java и ООП ...

1 Ответ

2 голосов
/ 13 января 2012

Если я правильно понимаю ваш вопрос, вы действительно хотите сделать что-то вроде этого:

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 для получения отчетов. С положительной стороны, это очень просто, но с отрицательной стороны это может теоретически привести к тому, что отчет будет сгенерирован несколько раз в многопоточной среде, но это будет редким явлением, и вы гарантированно, что по крайней мере все потоки видят точное тот же отчет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...