| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Синглетон нинзьлетон |
| Автор: JollyRoger0 16.3.2016, 20:18 | ||||
| Доброго времени суток. Я всем джуниорам джуниор, всем синьорам синьор и с пару месяцев назад прочитал подробненько про синглетон - самый простой шаблон ооп. Реализация понятна и очевидна, в своём недопроекте сделал часть "сущностей", которые должны быть в одном экземпляре синглетоном. Но - в чём смысл? Часть классов я сделал полностью статиками(все методы и переменные - даже если конструктор есть, это не нарушает "статичности" класса), и результат тот же, за исключением того, что я обращаюсь к синглетону
, а к статик классу
Что я выиграл синглетоном? Не думай, %юзернейм%те, что я такой прочитал, не понял, и сюда. Я гуглил про то, почему он существует и зачем нужен; объяснение, которое нашел - с синглетоном можно обращаться как с обьектом, в отличие от статик класса. А какая на Также читал в книге Джошуа Блоха, что делать такие статик классы - плохой тон, и вообще нунуну. Только обращаюсь я с ними(в рамках мегапроекта, по крайней мере) точно так же. |
| Автор: LSD 16.3.2016, 21:34 |
| Преимущество объекта над статическими методами в гибкости. Объект может реализовывать некий интерфейс и расширять некий класс. Можно иметь разные реализации и выбирать их в зависимости от условий. Объект можно загружать и выгружать по желанию: можно создавать объект при первом обращении и уничтожать после некого периода неактивности. |
| Автор: JollyRoger0 16.3.2016, 21:53 | ||
Но ведь и статический класс может реализовывать интерфейс/наследовать класс, при этом просто нужно добавить конструктор, то есть возможность создавать "пустой" объект класса, где всё еще будут все статик методы. И так же иметь разные реализации, все на статике основанные. Нипанятна. А на счёт памяти - да, логично, действительно синглетон можно лениво инициализировать. На счёт удалить когда ненужен - можно, да, методом, который присваивает статик полю класса(которое за инстанс отвечает) нуль. Так ли много памяти кушает один экземпляр - другой вопрос, и имхо это делает вопрос памяти в 99% случаев снятым. Хз так ли это. Спасибо за ответы, кстати:) |
| Автор: zera 17.3.2016, 11:11 | ||
можете пояснить кодом, как вы это себе представляете? |
| Автор: zera 17.3.2016, 18:43 |
строго говоря https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html. хотя я понимаю о чем ты. |
| Автор: JollyRoger0 17.3.2016, 20:06 | ||
Пример статик класса
По-хорошему он также должен быть финалом, но я не запаривался, небольшой проект то:) Как видно, вполне себе наследует класс, так же может реализовывать интерфейс. Ну да, то есть для классов, инстанс которых должен быть один и может весить много, синглетон нужен. А тулкит - суперкласс для всех платформенно-специфичных тулкитов, но зачем ему быть синглетоном? |
| Автор: CompWorm 18.3.2016, 02:40 |
| ты точно не путаешь статический класс и статический объект класса? у тебя не класс статический, а его мемберы, ибо можно создать много инстансов твоего класса. в случае репликации на класторе они будут у тебя поштучно передаваться, а не как один объект. синглтон следит за количеством своих инстансов, но он http://www.javaworld.com/article/2073352/core-java/simply-singleton.html, как кажется (эта статья не самая лучшая, но поверь, есть масса способов пофейлить синглтон). в целом, если можно избежать синглтона, лучше юзать статический объект. |
| Автор: JollyRoger0 18.3.2016, 03:32 |
| Я понимаю, что это не статик класс в прямом смысле слова и инстансы можно создавать, и да, если создать два инстанса, на них будут одинаковые данные благодаря статику. Но такой класс можно использовать, не доставая инстанса. Пример: я включаю в JFrame мой JPanel, который "статик". А когда мне нужно из других классов модифицировать JPanel этот, я просто вызываю статик методы, которые оперируют статик полями, в итоге меняя инстанс(и все остальные инстансы, будь их несколько, да. Но он один. И можно при желании сделать синглетон-"статик" Про то, что сфейлить легко, я знаю, читал и у Блоха, и в статьях - понятно. Обойти фейлы в принципе тоже просто - метод для доставания, а не напрямую(кэп), и enum с одним полем - экземляром. Enum содержит всё и по синхронизации, и по сериализации, и что-то еще там. Вот последняя часть самая интересная. Два преимущества тут: 1) - можно нестатические мемберы иметь в синглтоне. Но ведь нет разницы: private static поле для единственного обьекта, и соответственно public static (или не паблик, неважно) get set и другие обращения к нему, или просто private поле и public (или не паблик) геттеры сеттеры и прочее. Точнее, разница в том, что можно лениво инициализировать и удалить целый инстанс класса в синглетоне, и вместе с ним все поля сразу, а в случае статик класса нужно нуль каждому полю писать. Но это обычно не так и важно? 2) - синглтон содержит логику доступа к его данным, а статический объект контролируется извне, соответственно протестировать его проще, в случае мультитредовости, например. А тут вообще хз. Логику точно так же можно прописать в статик геттерах, сеттерах, и прочем, как и в обычных гет/сет/другое. Где он контролируется извне, а синглетон нет? оО |
| Автор: LSD 18.3.2016, 11:55 |
Больше ада! Самая веселуха начнется если создать второй инстанс этого класса. В данном случае ты как раз делаешь то про что я писал: ты просто делегируешь вызовы к синглетону. Если бы у тебя был нормальный синглетон, то программе были бы доступны все методы JPanel, а так у тебя 2 статик метода которые ты описал и все. Так что ни о какой реализации интерфейса или расширении класса речи и не идет. |
| Автор: JollyRoger0 18.3.2016, 17:58 | ||
А. Вот это имеет смысл:) Понятно |