Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Один экземпляр класса

#java


Как эффективно реализовать создание только одного экземпляра класса? Необходимо чтобы
создавать можно было только один объект. Вот что получилось у меня 

class Loader{
    private static int id = 0;
     static Loader newLoader(){
            if(id == 0){
                id++;
                return new Loader();
            }
            else
                return null;
    }
    private Loader(){

    }
}


Насколько это правильно? И Можно ли сделать так, чтобы метод newLoader() не возвращал
null в случае наличия уже созданного объекта, а присваивал ссылке тот же объект? То
есть  чтобы ссылка на объект не терялась. 
    


Ответы

Ответ 1



Вы "изобрели" singleton, в интернете полно примеров реализации. Самый простой пример: public class Singleton { private static Singleton instance; public static synchronized Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }

Ответ 2



На мой взгляд самый удобный способ в java создать Singleton: public class Singleton { // приватный конструктор - из вне нельзя будет создать объект. private Singleton() {} public static Singleton getInstance() { return SingletonHolder.HOLDER_INSTANCE; } static class SingletonHolder { private static final Singleton HOLDER_INSTANCE = new Singleton(); } } Советую прочитать статью «Правильный Singleton в Java» на Хабрахабре.

Ответ 3



если говорить о синглтонах то есть вот такая реализация "из коробки"/ by classloader, хочу отметить что в отличие от примера выше тут не нужна синхронизация: public enum Singleton { INSTANCE; public void someMethod(){ } } но все же лучше использовать Dependency Injection

Ответ 4



Физическое ограничение в один экземпляр класса - это всегда плохо. Рано или поздно требуется второй с категорически иным наполнением, и тут начинаются пляски с выставлением новых данных, использованием класса, и возвратом всего на место. Хорошим тоном считается создать ровно один экземпляр класса и передавать его в программе между другими объектами (если это необходимо). В случае сложной структуры в этом может помочь DI-контейнер, задача которого заключается как раз в том, чтобы создавать сервисы, держать в себе ссылки на них, автоматом подставлять их в конструкторы свежесоздающихся сервисов и разрешать цепочки зависимостей. В случае, если созданием ваших сервисов занимается контейнер, вы можете быть уверены что внутри контейнера хранится только один объект вашего сервиса. Для Java можно использовать Google Guice, например.

Ответ 5



Вообще, singleton я считаю здесь не нужен! Каждый вызов getInstance() занимает наносекунды на проверку условия if(...) Считаю, что данный вариант оптимален, ибо быстрее чем сразу не бывает: class Cat { private static Cat cat = new Cat(); private Cat() { } public void voice() { System.out.println("Meow :3"); } public static Cat getInstance() { return cat; } } Замечание: Отражения в Java в любом случае позволяют обойти всё, что вы придумаете для создания "единственного" экземпляра, и создать множество других ;)

Ответ 6



Я бы наверное так сделал: class Loader{ static Loader a = new Loader(); public Loader(){ return a; } }

Комментариев нет:

Отправить комментарий