![]() |
Модераторы: javastic, AntonSaburov |
![]() ![]() ![]() |
|
Kalisnik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
oxigen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Ключевое слово для поиска - singletone (синглтон)
простейший пример:
|
|||
|
||||
oxigen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
И как интересно два экземпляра одного класса используют одно и тоже поле static? Физически это поле в одной ячейки памяти находится?
Так и есть. В java есть такой интересный класс, который так и называется Class Он создается в единственном экземпляре при первом обращении к классу (при его загрузке). В нем и находятся все статические поля и методы. И каждый объект класса имеет ссылку на него. o.getClass(); |
|||
|
||||
Kalisnik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 21.6.2011 Репутация: нет Всего: нет |
||||
|
||||
Kalisnik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 21.6.2011 Репутация: нет Всего: нет |
||||
|
||||
oxigen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Не совсем правильно, что оно "не работает в многопоточной среде" Просто возможна такая ситуация: Два потока обращаются к этому методу одновременно(почти). Первый видит, что instance==null и начинает выполнять new Single(); В это время сюда же заходит второй поток - instance по прежнему null (пока первый поток не закончил выполнение конструктора, присваивание не произошло) И вот второй поток тоже начинает выполнять new Single(); В итоге создалось два экземпляра Single. Один для первого потока, один для второго. Но в MIDP приложениях Вы вряд ли столкнетесь с подобным случаем. |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: нет Всего: 28 |
Хмм... А выход тут, в принципе, какой? Объявить метод getInstance() синхронизированным? -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
oxigen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 12.4.2010 Репутация: 4 Всего: 4 |
Да по этому поводу куча рецептов есть. Со своими достоинствами и недостатками. Можно synchronized сделать, но это по производительности плохо. можно от ленивой инициализации избавиться
И еще куча всего. Паттерн распространенный и написано по его поводу очень много. |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: нет Всего: 28 |
Да, это хороший способ! Немного не в тему. oxigen, я смотрю, эта ветка, в основном, жива Вашими ответами. Поскольку те, кому Вы тут помогаете, пока не в состоянии оценить Вашу помощь, это сделаю я. Итак, Вам +. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
Kalisnik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 21.6.2011 Репутация: нет Всего: нет |
oxigen, спасибо. Уяснил
![]() |
|||
|
||||
![]() ![]() ![]() |
FAQ раздела лежит здесь! |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |