2015-07-17 5 views
2

Нужны ли классы, аннотированные @Singleton, Singleton design pattern?Do Guice @Singleton должен следовать шаблону дизайна Singleton?

Моя догадка заключается в том, что они этого не делают: нет необходимости иметь частный конструктор и метод static .instance(), но вместо этого он Guice гарантирует, что будет создан экземпляр только одного экземпляра класса.

+0

Да, это эквивалентно 'StaticObject.getInstance()' или 'public final static Object singleton'. Таким образом, вы убедитесь, что он потокобезопасен в многопоточном приложении. Во всяком случае, какой вопрос? –

+1

: Мой вопрос заключается в том, используют ли синглтоны в Guice (может/должен/не должен вообще) использовать шаблон дизайна для одиночных игр, описанный во многих других местах. отвечает, что не только Guice делает класс не нужно делать вещи, как у частного конструктора и т. Д., Но это ** не должно быть спроектировано именно так. Этот ответ был очень прояснен - ​​вовсе не было очевидно, что Guice повлияет на дизайн класса. – Jeff

ответ

6

Не только они не обязаны следовать шаблону Singleton, они явно не должны следовать ему.

Система, которая правильно настроена с помощью Guice, должна создавать как можно меньше собственных объектов, вместо этого позволить фреймворку выполнять все создание объекта. Кроме того, вы делаете не хотите, чтобы случайные классы в вашей системе вызывали .instance() на этом статическом экземпляре и, наконец, вы не хотите, чтобы Guice создавал статическую ссылку в классе Singleton, используя .requestStaticInjection().

Правильные вещи, связанные с вашими классами @Singleton, - это просто ввести их в классы, которые нуждаются в этой конкретной зависимости.

3

Разница между одноэлементным в Guice и регулярным синглетоном связана с контекстом.

Когда вы не используете Guice, вам нужно самостоятельно управлять своим синглоном. Чтобы убедиться, что создан только один экземпляр, у вас есть частный конструктор, статическое поле и методы доступа к этому экземпляру (либо геттер, либо окончание поля). Это означает, что экземпляр является singleton в контексте загрузчика классов. Если вы создадите другой загрузчик классов и скажите ему загрузить свой одноэлементный класс, вы можете создать второй экземпляр.

Когда одноточечно управляется Guice заменить частный конструктор и статическое поле с @Singleton аннотацию, говоря форсунку, что она должна только когда-либо создать один экземпляр этого класса и использовать его в любом месте она запрашивается. Поскольку возможно одновременное использование нескольких инжекторов (либо потому, что вам нужны два совершенно разных контекста, либо потому, что вы используете дочерние инжекторы), вы должны не должны запретить Guice создавать экземпляр нескольких экземпляров вашего класса.

Кроме того, поскольку вы должны полагаться на Guice для обеспечения синглтона везде, где требуется, нет необходимости в статическом поле, содержащем экземпляр singleton, поскольку он никогда не должен быть доступен.

Смежные вопросы