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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один экземпляр класса на всю программу? 
:(
    Опции темы
Kalisnik
Дата 29.5.2012, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Глупый наверно вопрос, но что-то волнует он меня )) 

Допустим у меня есть 4 класса: A, B, C, D. 
Мне нужно что бы в классах A, B и C использовался один и тот же экземпляр класса D.
Что я делаю. Создаю один экземпляр в классе A и раздаю его через get'ры остальным. Но при такой модели A уж больно сильно разрастается этими get'рами. Это невольно подводит к мысли что логика не верна. Как это делается правильно? В других языках вроде можно целый класс сделать статическим, только в java такой вариант не проходит.


P.S. Или до лампы сколько этих экземпляров D в программе, просто нужные поля и методы в нем помечаешь как static и все? Думал просто не загружать систему лишними и в общем-то ненужными объектами. И как интересно два экземпляра одного класса используют одно и тоже поле static? Физически это поле в одной ячейки памяти находится? 

Это сообщение отредактировал(а) Kalisnik - 29.5.2012, 20:05
PM MAIL   Вверх
oxigen
Дата 30.5.2012, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ключевое слово для поиска - singletone (синглтон)

простейший пример:

Код

public class Single {
private static Single instance;  // единственный экземпляр

private Single() { //конструктор private, чтоб нельзя было снаружи создавать новые экземпляры через new
}

 public static Single getInstance() {
        if (instance == null) {
            instance = new Single();
        }
        return instance;
    }

}

//Использование:

Single s = Single.getInstance(); //всегда возвращает ссылку на единственный объект класса Single 


PM MAIL   Вверх
oxigen
Дата 30.5.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И как интересно два экземпляра одного класса используют одно и тоже поле static? Физически это поле в одной ячейки памяти находится? 
Так и есть. 
В java есть такой интересный класс, который так и называется Class
Он создается в единственном экземпляре при первом обращении к классу (при его загрузке). В нем и находятся все статические поля и методы.
И каждый объект класса имеет ссылку на него. o.getClass();
PM MAIL   Вверх
Kalisnik
Дата 31.5.2012, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



oxigen, спасибо. Только на Ваших ответах в основном и учусь. smile

Добавлено через 9 минут и 50 секунд
Цитата(oxigen @  30.5.2012,  11:37 Найти цитируемый пост)
простейший пример:


Ха! Действительно, все логично и просто. А я даже и не подумал так сделать. )))
PM MAIL   Вверх
Kalisnik
Дата 3.6.2012, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(oxigen @  30.5.2012,  11:37 Найти цитируемый пост)
простейший пример:


Написано, что это решение не работает в многопоточной среде. Почему?
PM MAIL   Вверх
oxigen
Дата 5.6.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

 public static Single getInstance() {
        if (instance == null) {
            instance = new Single();
        }
        return instance;
    }

Не совсем правильно, что оно "не работает в многопоточной среде"
Просто возможна такая ситуация: 

Два потока обращаются к этому методу одновременно(почти).
Первый видит, что instance==null и начинает выполнять  new Single();
В это время сюда же заходит второй поток - instance по прежнему null (пока первый поток не закончил выполнение конструктора, присваивание не произошло)
И вот второй поток тоже начинает выполнять new Single();
В итоге создалось два экземпляра Single. Один для первого потока, один для второго.

Но в MIDP приложениях Вы вряд ли столкнетесь с подобным случаем.
PM MAIL   Вверх
Pawl
Дата 5.6.2012, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(oxigen @  5.6.2012,  15:58 Найти цитируемый пост)
В итоге создалось два экземпляра Single. Один для первого потока, один для второго.

Хмм... А выход тут, в принципе, какой? Объявить метод getInstance() синхронизированным?


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
oxigen
Дата 5.6.2012, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pawl @ 5.6.2012,  16:54)
Цитата(oxigen @  5.6.2012,  15:58 Найти цитируемый пост)
В итоге создалось два экземпляра Single. Один для первого потока, один для второго.

Хмм... А выход тут, в принципе, какой? Объявить метод getInstance() синхронизированным?

Да по этому поводу куча рецептов есть.  Со своими достоинствами и недостатками.
Можно synchronized сделать, но это по производительности плохо.
можно от ленивой инициализации избавиться
Код

private static final Single instance = new Single();

И еще куча всего.

Паттерн распространенный и написано по его поводу очень много.
PM MAIL   Вверх
Pawl
Дата 5.6.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(oxigen @  5.6.2012,  17:14 Найти цитируемый пост)
можно от ленивой инициализации избавиться

Да, это хороший способ!
Немного не в тему. oxigen, я смотрю, эта ветка, в основном, жива Вашими ответами. Поскольку те, кому Вы тут помогаете, пока не в состоянии оценить Вашу помощь, это сделаю я. Итак, Вам +.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Kalisnik
Дата 6.6.2012, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



oxigen, спасибо. Уяснил smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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