#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; } }
Комментариев нет:
Отправить комментарий