powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Порядок инициализации в классе
9 сообщений из 9, страница 1 из 1
Порядок инициализации в классе
    #33386624
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, задача: делается класс "список, фильтруемый по вводимому значению". То есть пользователь жмет в textfield-е на кнопки, и содержимое jlist-а бодро сжимается, оставляя только строки, соответствующие маске. Для этого делается наследник JList, который внутри себя создает панельку и скролл для саморазмещения, textfield фильтра, размещенный на той же панельке итп. Итого - получается объект, которым в любом месте можно заменить JList исправлением одной-двух строк.

Для осуществления собственно фильтрации создается внутренняя ListModel, фильтрующая первичную модель листбокса. Соответственно, до пятой версии работал примерно следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  FilteredList {

   public  FilteredList (ListModel model) {
     super  (makeFilterModel (model));
    ....
  }

   private  ListModel extModel;
   private  ListModel intModel;

   private  ListModel makeFilterModel (ListModel model) {
    extModel = model;
    intModel =  new  FilterModel (model);
     return  intModel;
  }

   public  ListModel getModel() { return  extModel;}

  TextListener lsnrFilterChanged =  new  TextListener() {
    ... intModel.filterBy (textFilter.getText()); ...
  }
}

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

Вопрос: существует ли какое-либо красивое решение в такой ситуации? Я пока что остановился на варианте

Код: plaintext
1.
2.
3.
4.
   public  FilteredList (ListModel model) {
     super  ( new  Object[ 0 ]);
    setModel (model);
  }

но хочется чего-то менее уродского.
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33386741
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может setModel() переопределить?
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33386821
grady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ пятой версии этот код, соответственно, перестает работать, ругаясь на невозможность слишком раннего обращения к this.


Проверил в 1.4 - компилятор тоже по рукам за подобные шутки выдает. И правильно делает.

Можно сделать фабричный метод.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  MyClass {

	 private  MyClass(){...}
	
	 static  MyClass construct(Object[] args){
	     MyClass ret;
		
	     ret =  new  MyClass();
	     ret.initialize(args);
		
	      return  ret;
	}
	
	 public   static   void  main(String[] args) {
	     MyClass my = MyClass.construct(...);
	}

}

Хотя по-большому счету те же яйца, вид сбоку
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33386919
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriможет setModel() переопределить?
Дык само собой, переопределено, через тот же makeFilterModel - поэтому вариант, на котором я пока остановился, и работает :)

Вопрос в том, что во-первых не хочется понижать функциональность класса; если у предка есть конструктор с моделью, то и у потомка должен быть такой же, пока это имеет смысл. А во-вторых, из эстетства не хочется создавать временную модель, вся цель которой - позволить конструктору отработать.

Проверил в 1.4 - компилятор тоже по рукам за подобные шутки выдает.
Хм. Может быть, я в чем-то ошибаюсь. Факт, что эта ошибка начала проявляться при переползании на 1.5

И правильно делает.
Спорно. Имхо, вместо того, чтобы решить проблему, заметают ее дальше под кровать.

Можно сделать фабричный метод.
Не слишком удобно, поскольку нужна хорошая совместимость; практически нужно, чтобы во всех местах, где сейчас стоит new MyList, я мог бы поставить new MyFilteredList и быть уверенным, что все будет работать, ну и наоборот.
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33386988
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

а можно посмотреть код конструктора родительского класса?
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33387153
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriа можно посмотреть код конструктора родительского класса?

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
 class  BFilteredList  extends  BList {
   public  BFilteredList (ListModel dataModel) {
     super  ( new  Object[ 0 ]);
    setModel (dataModel);
      // здесь когда-то стоял super (makeFilterModel (dataModel))
  }

  ....

 class  BList  extends  JList {
   public  BList (ListModel dataModel) {
     super  (dataModel);
    init();
  }

  ....

 class  JList  extends  JComponent {
     public  JList(ListModel dataModel)
    {
         if  (dataModel ==  null ) {
             throw   new  IllegalArgumentException("dataModel must be non null");
        }

        // Register with the ToolTipManager so that tooltips from the
        // renderer show through.
        ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
        toolTipManager.registerComponent( this );
        
        layoutOrientation = VERTICAL;

         this .dataModel = dataModel;
        selectionModel = createSelectionModel();
        setAutoscrolls(true);
        setOpaque(true);
        updateUI();
    }
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33387454
marx_freedom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эмуляция данного случая.
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
 public   class  A
{
	 public   static   void  main(String[] args)
	{
		C cc =  new  C();
		System.out.println("a");
	}
}

 public   class  B
{
         public  B()
	{
		set();
	}

	 public   void  set()
	{
		System.out.println("b");
	}
        
}

 public   class  C 
	 extends  B
{

	 public  C()
	{
		 super ();
	}

	 public   void  set()
	{
		System.out.println("c");
	}
}

На экран печатается ca.

Тут, как я понимаю, тоже самое. Во время работы конструктора
Код: plaintext
 super (makeFilterModel(model));
происходит вызов вашего переопределенного метода setModel.
так что я бы предложил сделать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  BFilteredList 
     extends  BList 
{
     public  BFilteredList (ListModel dataModel)
    {
         super  (dataModel);
    }

     public   void  setModel (ListModel m) 
    {
         if  (! (m  instanceof  FilterModel))
             super .setModel( new  FilterModel(m));
         else 
             super .setModel (m);
    }



...

}
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33388586
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marx_freedom
Спасибо. Хорошая идея, но, боюсь, в этом случае не сработает.

marx_freedomВо время работы конструктора происходит вызов вашего переопределенного метода setModel.
Код: plaintext
1.
2.
3.
     public  JList(ListModel dataModel)
    {
        .....
         this .dataModel = dataModel;
...
Рейтинг: 0 / 0
Порядок инициализации в классе
    #33388708
marx_freedom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerв этом случае не сработает.
да.. надо было все же глянуть исходник перед предположением ;-)

тогда я бы остановился на приведенном выше переопределении setModel и таком конструкторе
Код: plaintext
1.
2.
3.
4.
5.
 public  BFilteredList (ListModel dataModel)
{
     super ();
    setModel(dataModel);
}

или еще как вариант попробовать конструктор
Код: plaintext
1.
     super ( new  FilterModel(dataModel));
правда не знаю, насколько он вам подойдет :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Порядок инициализации в классе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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