Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка имплементирования Синглтона или непонимание механизма? / 17 сообщений из 17, страница 1 из 1
27.07.2006, 20:09
    #33883493
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
в этом топике: http://]http://sql.ru/forum/actualthread.aspx?tid=318241
я упоминал о моей проблеме.

Я использую Синглтон класс и выяснил, что он работает не так, как я ожидал.
Вот сокращ. мой класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 public   class  MyViewsFactory {
 private  ViewsFactory instance =  null ;
...
 private  moverView1 =  null ;
...
 private  MyViewsFactory () {}

 public   static  MyViewsFactory getInstance() {...}

//Вот единственный метод, где это значение меняется:
 public  MyMoverView getMyMoverView(){
          if  (goalsMoverView1 ==  null ) {    
             goalsMoverView1 =  new  MyMoverView ();
         } 
         return  goalsMoverView1;
}
//здесь только вызов апдейта идет
 public   void  update{
 if  (moverView1 !=  null ) { //ЗДЕСЬ КРОЕТСЯ ПРОБЛЕМА!?
  moverView1.update();
}

}

другие классы (несколько) используют Фактори, чтобы получить этот Вью таким образом:
Код: plaintext
ViewsFactory.getInstance().getMyMoverView()

проблема заключается в том, что метод update() не срабатывает, тогда когда мне нужно, из за того, что условие
Код: plaintext
 if  (goalsMoverView1 ==  null )
не выполняется.

Я выяснил что при любом вызове метода
Код: plaintext
ViewsFactory.getInstance().getMyMoverView()
происходит реинициализация аттрибута private moverView1 = null

Для того чтобы решить проблему я изменил код таким образом, чтобы обращаться к этому аттрибуту через instance.
И теперь в классе Фактори, везде использую такое обращение:
Код: plaintext
1.
2.
3.
  if  (instance.goalsMoverView1 !=  null ) {
                instance.moverView1.update();
}
}

ВОПРОС:
почему так происходит? Разве каждый раз при вызове статического метода класса
Код: plaintext
ViewsFactory.getInstance().getMyMoverView()
создается новый объект? Если да, то как правильно использовать Синглтон или в чем моя ошибка?

Спасибо
...
Рейтинг: 0 / 0
27.07.2006, 20:21
    #33883523
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
в описании вопроса и в коде есть некоторые неточности:

предложение "проблема заключается в том,...что условие
if (goalsMoverView1 == null) не выполняется" следует читать таким образом:

"проблема заключается в том, что условие почти всегда выполняется (т.к. аттрибут сбрасывается на нуль) и соответственно вызов метода апдейт не происходит."

Также в описании используются иногда разные названия аттрибута: иногда goalsMoverView1 иногда MoverView1. На самом деле, речь идет об одном и том же аттрибуте (просто пытаясь упростить код, был недостаточно внимателен)
...
Рейтинг: 0 / 0
28.07.2006, 07:58
    #33883975
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Первая мысль: может быть проблемы из-за отсутствия синхронизации?

======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
28.07.2006, 08:02
    #33883980
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
А, понял! Это ж у тебя не синглтон! В синглтоне инстанс объявляется статическим. А ты здесь создаешь по экземпляру класса на каждый поток.
Вот это должно помочь:

private static ViewsFactory instance = null;

======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
28.07.2006, 14:17
    #33885295
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Кувалдин РоманА, понял! Это ж у тебя не синглтон! В синглтоне инстанс объявляется статическим. А ты здесь создаешь по экземпляру класса на каждый поток.
Вот это должно помочь:

private static ViewsFactory instance = null;

у меня на самом деле инстанс и определена статически, т.е. так:
Код: plaintext
 private   transient   static  ViewsFactory instance =  null ;

так что вопрос остается открытым.
А про какие потоки и синхронизацию ты говоришь? У меня в общем нету потоков паралельных.
...
Рейтинг: 0 / 0
28.07.2006, 14:22
    #33885314
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Кажется мне проще будет взять какой нибудь мануал и переписать Синглтон...
...
Рейтинг: 0 / 0
28.07.2006, 14:27
    #33885336
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Описание синглтона на примере коннекш пула
http://lib.juga.ru/article/articleview/162/1/68/
...
Рейтинг: 0 / 0
29.07.2006, 21:14
    #33887192
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
так в чем моя ошибка-то?

В примере не вижу ничего такого, чтобы пояснило проблему
...
Рейтинг: 0 / 0
30.07.2006, 13:06
    #33887536
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Neulingтак в чем моя ошибка-то?

В примере не вижу ничего такого, чтобы пояснило проблему

Выложи-ка сюда исходники. Собственно, класс, и запускалку к нему, где видно, что у тебя не работает.
...
Рейтинг: 0 / 0
30.07.2006, 14:22
    #33887582
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
код класса уже выложен (полностью нет смысла, т.к. там много других аттрибутов и методов, которые к проблеме не имеют отношения).

Проблема тоже указана, вот еще раз выдержка:
Код: plaintext
1.
2.
3.
4.
5.
//здесь только вызов апдейта идет
 public   void  update{
 if  (moverView1 !=  null ) { //ЗДЕСЬ КРОЕТСЯ ПРОБЛЕМА!?
  moverView1.update();
}
условие if (moverView1 != null) выполняется не так, как ожидается и соответственно не происходит ожидаемый вызов moverView1.update()

По моим наблюдениям, аттрибут moverView1 устанавливается всегда в нуль, если один из посторонних классов вызывает метод ViewsFactory.getInstance(), что на МОЙ взгляд не должно происходить, так как метод статический и на сколько я знаю, реинициализации аттрибутов не должно происходить.
...
Рейтинг: 0 / 0
30.07.2006, 14:39
    #33887590
я
я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Neulingкод класса уже выложен (полностью нет смысла, т.к. там много других аттрибутов и методов, которые к проблеме не имеют отношения).

Проблема тоже указана, вот еще раз выдержка:
Код: plaintext
1.
2.
3.
4.
5.
//здесь только вызов апдейта идет
 public   void  update{
 if  (moverView1 !=  null ) { //ЗДЕСЬ КРОЕТСЯ ПРОБЛЕМА!?
  moverView1.update();
}
условие if (moverView1 != null) выполняется не так, как ожидается и соответственно не происходит ожидаемый вызов moverView1.update()

По моим наблюдениям, аттрибут moverView1 устанавливается всегда в нуль, если один из посторонних классов вызывает метод ViewsFactory.getInstance(), что на МОЙ взгляд не должно происходить, так как метод статический и на сколько я знаю, реинициализации аттрибутов не должно происходить.
рузскей езык панимаеш?
тест кейс давай.
...
Рейтинг: 0 / 0
30.07.2006, 19:42
    #33887775
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
NeulingПо моим наблюдениям, аттрибут moverView1 устанавливается всегда в нуль, если один из посторонних классов вызывает метод ViewsFactory.getInstance(), что на МОЙ взгляд не должно происходить, так как метод статический и на сколько я знаю, реинициализации аттрибутов не должно происходить.

Это с чего бы не должно происходить вызовов?

П.С. У меня синглтоны работают. А вот какой косяк в столь тщательно охраняемом тобой коде - я не знаю.
...
Рейтинг: 0 / 0
31.07.2006, 17:42
    #33889999
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Кувалдин Роман NeulingПо моим наблюдениям, аттрибут moverView1 устанавливается всегда в нуль, если один из посторонних классов вызывает метод ViewsFactory.getInstance(), что на МОЙ взгляд не должно происходить, так как метод статический и на сколько я знаю, реинициализации аттрибутов не должно происходить.

Это с чего бы не должно происходить вызовов?

П.С. У меня синглтоны работают. А вот какой косяк в столь тщательно охраняемом тобой коде - я не знаю.
...
Рейтинг: 0 / 0
31.07.2006, 19:48
    #33890298
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
предыдущее сообщение-не читать(сбой при отправке)

Кувалдин РоманЭто с чего бы не должно происходить вызовов?

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

Кувалдин Роман
П.С. У меня синглтоны работают. А вот какой косяк в столь тщательно охраняемом тобой коде - я не знаю.
я не охраняю свой код. Что нужно выложить-то еще, не пойму?
...
Рейтинг: 0 / 0
01.08.2006, 00:55
    #33890643
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Все. Сначала у тебя:
Код: plaintext
 private  ViewsFactory instance =  null ;
А потом выясняется что:
Код: plaintext
 private   transient   static  ViewsFactory instance =  null ;

Затем:
авторТакже в описании используются иногда разные названия аттрибута: иногда goalsMoverView1 иногда MoverView1 . На самом деле, речь идет об одном и том же аттрибуте (просто пытаясь упростить код, был недостаточно внимателен)

посему, чтобы не тратить время на выяснение, где ты еще накосячил - давай полный код и тест-кейс.
...
Рейтинг: 0 / 0
02.08.2006, 00:33
    #33893265
Neuling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
что такое тест-кейс?
запускающая программка, которая приводит к ошибке?

Если да, то нужно еще сообразить. К сож., времени сегодня уже нет. Постараюсь что-нибудь придумать.

Спасибо
...
Рейтинг: 0 / 0
02.08.2006, 18:37
    #33895611
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка имплементирования Синглтона или непонимание механизма?
Neulingчто такое тест-кейс?
запускающая программка, которая приводит к ошибке?

Ну вообще TestCase - это один из классов фреймворка JUnit. Но я имел в виду некий код, который показывает ошибку
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка имплементирования Синглтона или непонимание механизма? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]