Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синглетон нинзьлетон, смысл? 
:(
    Опции темы
JollyRoger0
Дата 16.3.2016, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Доброго времени суток. Я всем джуниорам джуниор, всем синьорам синьор и с пару месяцев назад прочитал подробненько про синглетон - самый простой шаблон ооп. Реализация понятна и очевидна, в своём недопроекте сделал часть "сущностей", которые должны быть в одном экземпляре синглетоном.
 Но - в чём смысл? Часть классов я сделал полностью статиками(все методы и переменные - даже если конструктор есть, это не нарушает "статичности" класса), и результат тот же, за исключением того, что я обращаюсь к синглетону  
Код

SingletonClass.getInstance().getThat();

, а к статик классу
Код

StaticClass.getThat();


Что я выиграл синглетоном?
Не думай, %юзернейм%те, что я такой прочитал, не понял, и сюда. Я гуглил про то, почему он существует и зачем нужен; объяснение, которое нашел - с синглетоном можно обращаться как с обьектом, в отличие от статик класса. А какая на smile  разница? Что-то в сериализации что ли выигрывается?
Также читал в книге Джошуа Блоха, что делать такие статик классы - плохой тон, и вообще нунуну. Только обращаюсь я с ними(в рамках мегапроекта, по крайней мере) точно так же.
PM MAIL   Вверх
LSD
Дата 16.3.2016, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
JollyRoger0
Дата 16.3.2016, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Цитата(LSD @ 16.3.2016,  21:34)
Преимущество объекта над статическими методами в гибкости. Объект может реализовывать некий интерфейс и расширять некий класс. Можно иметь разные реализации и выбирать их в зависимости от условий.

Но ведь и статический класс может реализовывать интерфейс/наследовать класс, при этом просто нужно добавить конструктор, то есть возможность создавать "пустой" объект класса, где всё еще будут все статик методы. И так же иметь разные реализации, все на статике основанные. Нипанятна.

А на счёт памяти - да, логично, действительно синглетон можно лениво инициализировать. На счёт удалить когда ненужен - можно, да, методом, который присваивает статик полю класса(которое за инстанс отвечает) нуль. Так ли много памяти кушает один экземпляр - другой вопрос, и имхо это делает вопрос памяти в 99% случаев снятым. Хз так ли это.

Спасибо за ответы, кстати:)

Это сообщение отредактировал(а) JollyRoger0 - 16.3.2016, 21:55
PM MAIL   Вверх
zera
Дата 17.3.2016, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 19.1.2006
Где: saint-petersburg

Репутация: нет
Всего: 9



Цитата(JollyRoger0 @  16.3.2016,  21:53 Найти цитируемый пост)
Но ведь и статический класс может реализовывать интерфейс/наследовать класс

можете пояснить кодом, как вы это себе представляете?

PM MAIL   Вверх
LSD
Дата 17.3.2016, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(JollyRoger0 @  16.3.2016,  22:53 Найти цитируемый пост)
Но ведь и статический класс может реализовывать интерфейс/наследовать класс, при этом просто нужно добавить конструктор, то есть возможность создавать "пустой" объект класса, где всё еще будут все статик методы. И так же иметь разные реализации, все на статике основанные. Нипанятна.

В Java нет такой вещи как статический класс. Все интерфейсные методы не статические, соответственно должен быть объект.

Цитата(JollyRoger0 @  16.3.2016,  22:53 Найти цитируемый пост)
Так ли много памяти кушает один экземпляр - другой вопрос, и имхо это делает вопрос памяти в 99% случаев снятым. Хз так ли это.

Еще как может, если это например компонент доступа к базе, да еще с кешем объектов, тут запросто могут быть сотни мегабайт.


Попробуй привести пример: есть абстрактный класс 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.
PM MAIL WWW   Вверх
zera
Дата 17.3.2016, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 19.1.2006
Где: saint-petersburg

Репутация: нет
Всего: 9



Цитата(LSD @  17.3.2016,  12:41 Найти цитируемый пост)
В Java нет такой вещи как статический класс.

строго говоря все-таки есть.  хотя я понимаю о чем ты.
PM MAIL   Вверх
JollyRoger0
Дата 17.3.2016, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Пример статик класса

Код

public class InfoPanel extends JPanel {
    private static final int WIDTH = 333;
    private static final int HEIGHT = 350;
    private static Image backImage = Pictures.infoPanelBackground();
    private static final JTextField VpsField = new JTextField();
    private static final JTextField virusesField = new JTextField();

    public InfoPanel() {
        setLayout(null);
        setLocation(666 + 36, 12);
        setSize(WIDTH, HEIGHT);
        setBackground(new Color(156, 183, 46));

        Reform.customizeTextField(VpsField, 16);
        Reform.customizeTextField(virusesField, 16);

        VpsField.setForeground(Color.YELLOW);
        virusesField.setForeground(Color.YELLOW);

        VpsField.setBounds(33, 260, 267, 22);
        virusesField.setBounds(33, 290, 267, 22);

        refreshVpsField();
        refreshVirusesField();

        add(virusesField);
        add(VpsField);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backImage, 0, 0, WIDTH, HEIGHT, this);
    }

    public static void refreshVpsField() {
        double vps = DataAfterMods.getTotalVPS();
        VpsField.setText("VPS: " + Reform.formatValue(vps) + "/s");
    }

    public static void refreshVirusesField() {
        double viruses = Data.getViruses();
        virusesField.setText("Viruses: " + Reform.formatValue(viruses));
    }
}

По-хорошему он также должен быть финалом, но я не запаривался, небольшой проект то:)

Как видно, вполне себе наследует класс, так же может реализовывать интерфейс.

Ну да, то есть для классов, инстанс которых должен быть один и может весить много, синглетон нужен.

А тулкит - суперкласс для всех платформенно-специфичных тулкитов, но зачем ему быть синглетоном?

Это сообщение отредактировал(а) JollyRoger0 - 17.3.2016, 21:53
PM MAIL   Вверх
CompWorm
Дата 18.3.2016, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



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

синглтон следит за количеством своих инстансов, но он не так прост, как кажется (эта статья не самая лучшая, но поверь, есть масса способов пофейлить синглтон). в целом, если можно избежать синглтона, лучше юзать статический объект.


Это сообщение отредактировал(а) CompWorm - 18.3.2016, 03:27


--------------------
PM MAIL   Вверх
JollyRoger0
Дата 18.3.2016, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Я понимаю, что это не статик класс в прямом смысле слова и инстансы можно создавать, и да, если создать два инстанса, на них будут одинаковые данные благодаря статику. Но такой класс можно использовать, не доставая инстанса. Пример: я включаю в JFrame мой JPanel, который "статик". А когда мне нужно из других классов модифицировать JPanel этот, я просто вызываю статик методы, которые оперируют статик полями, в итоге меняя инстанс(и все остальные инстансы, будь их несколько, да. Но он один. И можно при желании сделать синглетон-"статик" smile , где будет гарантированно один инстанс).

Про то, что сфейлить легко, я знаю, читал и у Блоха, и в статьях - понятно. Обойти фейлы в принципе тоже просто - метод для доставания, а не напрямую(кэп), и enum с одним полем - экземляром. Enum содержит всё и по синхронизации, и по сериализации, и что-то еще там.

Вот последняя часть самая интересная. Два преимущества тут:
1) - можно нестатические мемберы иметь в синглтоне.
Но ведь нет разницы:
private static поле для единственного обьекта, и соответственно public static (или не паблик, неважно) get set и другие обращения к нему, 
или просто private поле и public (или не паблик) геттеры сеттеры и прочее. 
Точнее, разница в том, что можно лениво инициализировать и удалить целый инстанс класса в синглетоне, и вместе с ним все поля сразу, а в случае статик класса нужно нуль каждому полю писать. Но это обычно не так и важно?

2) - синглтон содержит логику доступа к его данным, а статический объект контролируется извне, соответственно протестировать его проще, в случае мультитредовости, например.
А тут вообще хз. Логику точно так же можно прописать в статик геттерах, сеттерах, и прочем, как и в обычных гет/сет/другое. Где он контролируется извне, а синглетон нет? оО

Это сообщение отредактировал(а) JollyRoger0 - 18.3.2016, 03:34
PM MAIL   Вверх
LSD
Дата 18.3.2016, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(JollyRoger0 @  17.3.2016,  21:06 Найти цитируемый пост)
Пример статик класса

Больше ада! Самая веселуха начнется если создать второй инстанс этого класса.



В данном случае ты как раз делаешь то про что я писал: ты просто делегируешь вызовы к синглетону. Если бы у тебя был нормальный синглетон, то программе были бы доступны все методы 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.
PM MAIL WWW   Вверх
JollyRoger0
Дата 18.3.2016, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Цитата(LSD @ 18.3.2016,  11:55)
Цитата(JollyRoger0 @  17.3.2016,  21:06 Найти цитируемый пост)
Пример статик класса

Больше ада! Самая веселуха начнется если создать второй инстанс этого класса.



В данном случае ты как раз делаешь то про что я писал: ты просто делегируешь вызовы к синглетону. Если бы у тебя был нормальный синглетон, то программе были бы доступны все методы JPanel, а так у тебя 2 статик метода которые ты описал и все. Так что ни о какой реализации интерфейса или расширении класса речи и не идет.

А. Вот это имеет смысл:) Понятно smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.