Как я могу реализовать аннотацию @Singleton?



Возможно, повторный вопрос. Но мне нужно реализовать что-то вроде



@Singleton
public class Person {
}


, что обеспечит только один экземпляр объекта Person.



Один из способов - сделать конструктор приватным. Но это делает синглетную аннотацию излишней.

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

Возможно ли это вообще?

347   3  

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

    Ничего не найдено.