Здесь моя проблема:
Прежде всего важно знать, что я пишу симуляцию. Это автономное приложение и однопоточное. У меня есть по существу два класса объектов, которые имеют разные требования к области охвата.
-
Классы, которые должны использоваться в качестве синглонов на протяжении всего моделирования. Например, экземпляр Random.
-
Группы классов, созданные вместе, и внутри группы, каждый экземпляр должен обрабатываться как Singleton. Например, скажем,
RootObject- это класс верхнего уровня и имеет зависимость отClassAиClassB, оба из которых имеют зависимость отClassD. Для любого заданногоRootObjectобе его зависимости (ClassAиClassB) должны зависеть от того же экземпляраClassD. Однако экземплярыClassDне должны использоваться для разных экземпляровRootObject.
Надеюсь, это имеет смысл. Я могу придумать два подхода к этому. Один из них заключается в том, чтобы пометить все введенные объекты как Singletons, создать инжектор корня и открутить дочерний инжектор каждый раз, когда мне нужно создать новый экземпляр RootObject. Затем экземпляры RootObject и всех его зависимостей создаются как синглтоны, но эта информация о масштабах выбрасывается в следующий раз, когда я иду, чтобы создать еще один RootObject.
Второй подход - реализовать некоторый тип настраиваемой области.
Документация Guice дает противоречивые советы... С одной стороны, в ней говорится, что у вас должен быть один инжектор, и в идеале он один раз вызывается для создания класса высшего уровня. С другой стороны, он говорит, чтобы держаться подальше от пользовательских областей.