![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
JollyRoger0 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.1.2016 Репутация: нет Всего: нет |
Доброго времени суток. Я всем джуниорам джуниор, всем синьорам синьор и с пару месяцев назад прочитал подробненько про синглетон - самый простой шаблон ооп. Реализация понятна и очевидна, в своём недопроекте сделал часть "сущностей", которые должны быть в одном экземпляре синглетоном.
Но - в чём смысл? Часть классов я сделал полностью статиками(все методы и переменные - даже если конструктор есть, это не нарушает "статичности" класса), и результат тот же, за исключением того, что я обращаюсь к синглетону
, а к статик классу
Что я выиграл синглетоном? Не думай, %юзернейм%те, что я такой прочитал, не понял, и сюда. Я гуглил про то, почему он существует и зачем нужен; объяснение, которое нашел - с синглетоном можно обращаться как с обьектом, в отличие от статик класса. А какая на ![]() Также читал в книге Джошуа Блоха, что делать такие статик классы - плохой тон, и вообще нунуну. Только обращаюсь я с ними(в рамках мегапроекта, по крайней мере) точно так же. |
||||
|
|||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Преимущество объекта над статическими методами в гибкости. Объект может реализовывать некий интерфейс и расширять некий класс. Можно иметь разные реализации и выбирать их в зависимости от условий. Объект можно загружать и выгружать по желанию: можно создавать объект при первом обращении и уничтожать после некого периода неактивности.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
JollyRoger0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.1.2016 Репутация: нет Всего: нет |
Но ведь и статический класс может реализовывать интерфейс/наследовать класс, при этом просто нужно добавить конструктор, то есть возможность создавать "пустой" объект класса, где всё еще будут все статик методы. И так же иметь разные реализации, все на статике основанные. Нипанятна. А на счёт памяти - да, логично, действительно синглетон можно лениво инициализировать. На счёт удалить когда ненужен - можно, да, методом, который присваивает статик полю класса(которое за инстанс отвечает) нуль. Так ли много памяти кушает один экземпляр - другой вопрос, и имхо это делает вопрос памяти в 99% случаев снятым. Хз так ли это. Спасибо за ответы, кстати:) Это сообщение отредактировал(а) JollyRoger0 - 16.3.2016, 21:55 |
|||
|
||||
zera |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 19.1.2006 Где: saint-petersburg Репутация: нет Всего: 9 |
||||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В Java нет такой вещи как статический класс. Все интерфейсные методы не статические, соответственно должен быть объект.
Еще как может, если это например компонент доступа к базе, да еще с кешем объектов, тут запросто могут быть сотни мегабайт. Попробуй привести пример: есть абстрактный класс java.awt.Toolkit и есть его конкретные реализации для разных платформ. Более того можно задать свою реализацию через системную пропертю awt.toolkit. Если пытаться реализовать тоже самое через статические методы, то все равно из них пришлось бы делегировать вызовы или в нативный код или в специальный скрытый объект. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
zera |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 19.1.2006 Где: saint-petersburg Репутация: нет Всего: 9 |
||||
|
||||
JollyRoger0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.1.2016 Репутация: нет Всего: нет |
Пример статик класса
По-хорошему он также должен быть финалом, но я не запаривался, небольшой проект то:) Как видно, вполне себе наследует класс, так же может реализовывать интерфейс. Ну да, то есть для классов, инстанс которых должен быть один и может весить много, синглетон нужен. А тулкит - суперкласс для всех платформенно-специфичных тулкитов, но зачем ему быть синглетоном? Это сообщение отредактировал(а) JollyRoger0 - 17.3.2016, 21:53 |
|||
|
||||
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
ты точно не путаешь статический класс и статический объект класса?
у тебя не класс статический, а его мемберы, ибо можно создать много инстансов твоего класса. в случае репликации на класторе они будут у тебя поштучно передаваться, а не как один объект. синглтон следит за количеством своих инстансов, но он не так прост, как кажется (эта статья не самая лучшая, но поверь, есть масса способов пофейлить синглтон). в целом, если можно избежать синглтона, лучше юзать статический объект. Это сообщение отредактировал(а) CompWorm - 18.3.2016, 03:27 |
|||
|
||||
JollyRoger0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.1.2016 Репутация: нет Всего: нет |
Я понимаю, что это не статик класс в прямом смысле слова и инстансы можно создавать, и да, если создать два инстанса, на них будут одинаковые данные благодаря статику. Но такой класс можно использовать, не доставая инстанса. Пример: я включаю в JFrame мой JPanel, который "статик". А когда мне нужно из других классов модифицировать JPanel этот, я просто вызываю статик методы, которые оперируют статик полями, в итоге меняя инстанс(и все остальные инстансы, будь их несколько, да. Но он один. И можно при желании сделать синглетон-"статик"
![]() Про то, что сфейлить легко, я знаю, читал и у Блоха, и в статьях - понятно. Обойти фейлы в принципе тоже просто - метод для доставания, а не напрямую(кэп), и enum с одним полем - экземляром. Enum содержит всё и по синхронизации, и по сериализации, и что-то еще там. Вот последняя часть самая интересная. Два преимущества тут: 1) - можно нестатические мемберы иметь в синглтоне. Но ведь нет разницы: private static поле для единственного обьекта, и соответственно public static (или не паблик, неважно) get set и другие обращения к нему, или просто private поле и public (или не паблик) геттеры сеттеры и прочее. Точнее, разница в том, что можно лениво инициализировать и удалить целый инстанс класса в синглетоне, и вместе с ним все поля сразу, а в случае статик класса нужно нуль каждому полю писать. Но это обычно не так и важно? 2) - синглтон содержит логику доступа к его данным, а статический объект контролируется извне, соответственно протестировать его проще, в случае мультитредовости, например. А тут вообще хз. Логику точно так же можно прописать в статик геттерах, сеттерах, и прочем, как и в обычных гет/сет/другое. Где он контролируется извне, а синглетон нет? оО Это сообщение отредактировал(а) JollyRoger0 - 18.3.2016, 03:34 |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Больше ада! Самая веселуха начнется если создать второй инстанс этого класса. В данном случае ты как раз делаешь то про что я писал: ты просто делегируешь вызовы к синглетону. Если бы у тебя был нормальный синглетон, то программе были бы доступны все методы JPanel, а так у тебя 2 статик метода которые ты описал и все. Так что ни о какой реализации интерфейса или расширении класса речи и не идет. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
JollyRoger0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.1.2016 Репутация: нет Всего: нет |
А. Вот это имеет смысл:) Понятно ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |