Как я могу реализовать аннотацию @Singleton?
Возможно, повторный вопрос. Но мне нужно реализовать что-то вроде
@Singleton
public class Person {
}
, что обеспечит только один экземпляр объекта Person.
Один из способов - сделать конструктор приватным. Но это делает синглетную аннотацию излишней.
Я действительно не мог понять, могу ли я действительно ограничить создание объекта одним объектом, не делая конструктор частным.
Возможно ли это вообще?
3 ответов:
Никакая аннотация не может помешать созданию экземпляра класса. Однако, если вы планируете реализовать что-то вроде фреймворка внедрения зависимостей или просто простой фабрики объектов, то вы можете использовать отражение, чтобы прочитать аннотацию и предотвратить создание экземпляра класса более одного раза, но я понимаю, что это не тот ответ, который вы искали.
На самом деле вы можете подумать о том, чтобы отказаться от синглетного шаблона и перейти к более современному решению, такому как правильный DI-фреймворк, что может дать вам тот же результат - с большей гибкостью.
public class ASingletonClass { private static ASingletonClass instance = null; private ASingletonClass() { } public static ASingletonClass getInstance() { if(instance==null) { instance = new ASingletonClass(); } return instance; } }Это правильный способ реализации синглтона. Аннотация не может остановить людей от вызова общедоступного конструктора.
Пример
@Singletoneреализация шаблона, которая является потокобезопасной :public class SomeDataSource { private static volatile SomeDataSource INSTANCE; // Prevent direct instantiation. private SomeDataSource() { // Leave it empty or implement any logic needed } public static SomeDataSource getInstance() { if (INSTANCE == null) { synchronized (SomeDataSource.class) { if (INSTANCE == null) { INSTANCE = new SomeDataSource(); } } } return INSTANCE; } // Implement some logic }А затем просто используйте этот код, чтобы получить Синглетон и быть в безопасности:
SomeDataSource dataSource = SomeDataSource.getInstance();В этом примере показан класс, который будет обрабатывать доступ к базе данных (логика опущено для краткости)
Или вы можете использовать некоторые библиотеки инъекций зависимостей. Dagger2 например:
@Provides @Singleton static Heater provideHeater() { return new ElectricHeater(); }
Comments