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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со структурами и списками 
:(
    Опции темы
Gugle
Дата 1.2.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!
Прошу знатоков рассеить мои сомнения. Сначала опишу задачу.
Есть несколько классов, описывающих структуру.
Код

public class Structure1 {

    private String id;
    private String value;
    private String type;

    public Structure1(String id, String value, String type) {
        this.id = id;
        this.value = value;
        this.type = type;
    }

    public String getId() {
        return id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

Таких структур несколько.

МЕТОД ПЕРВЫЙ!
Код

//Такие стуктуры можно использовать напимер в ArrayList.
ArrayList<Structure1> listS1 = new ArrayList<Structure1>();
ArrayList<Structure2> listS2 = new ArrayList<Structure2>();

//И радоваться жизни
listS1.add(new Structure1(id, value, type));
String s = listS1.get(0).getId();
...

//Или так:
Map<Structure1> listS1 = new HashMap<Structure1>();
Map<Structure2> listS2 = new HashMap<Structure2>();
// И радоваться жизни
Map<String, Structure1> listS1 = new HashMap<String, Structure1>();
Map<String, Structure2> listS2 = new HashMap<String, Structure2>();
listS1.put("id1", new Structure1(id, value, type));
s = listS1.get("id1").getId();


МЕТОД ВТОРОЙ!
НО! С эими же самыми данными, т.е. listS1...listS2, мне надо проделывать не только простые операции (причем таких обращений к спискам очень много):
- добавление
- извлечение
- изменение
- удаление
- и т.д.

но и отображать эти списки в таблицах. Для этого я переопределил модель таблицы:

Код

public class TableModelObject extends AbstractTableModel {
    public TableModelObject(Object obj) {
    // Сюда я передаю саму стуктуру, например Structure1
    // вытаскиваю названия полей (field) и получаю, готовую модель
    // для работы с визуальной таблицей
    }

    // Естественно ниже я описал все необходимые мне методы, для
    // работы табличной модели
    public int getRowCount() {}

    public int getColumnCount() {}

    public Object getValueAt(int rowIndex, int columnIndex) {}

    // И т.д.
    /**Табличные данные*/
    private ArrayList<Object> data = new ArrayList<Object>();
}


Получилось, что связав таким образом модель списков с моделью в таблицах, я упростил себе работу с отображением, но усложнил себе работу с доступом к самим данным в списках, т.к. теперь для этого надо
либо знать ячейку, в которой лежат данные и обращаться к ней по номерам:
Код

String id = (String) tableModel.getValueAt(row, column);


либо приводить типы данных
Код

TableModelObject tm = new TableModelObject(new Structure1());
tm.setRow(tm.getColumnCount()+1, new Structure1());
Object o = tm.getData().get(0);
if (o instanceof Structure1) {
    Structure1 l = (Structure1) o;
    s = l.getId();
}


А вот теперь собственно вопросы:
1. Какой из методов менее ресурсоемок? (ведь в памяти придется держать, либо HashMap<Structure1>(), либо TableModelObject(new Structure1()))
2. Если первый метод менее ресурсоемок, то не буду ли я в проигрыше при создании моделей для таблиц? (веть их придется держать в памяти)
3. Если на второй вопрос ответ "да", то как синхронизировать модель списка и модель таблиц?
4. Как в решают такие задачи гуру? (Лирика, но интересно)
PM MAIL   Вверх
COVD
Дата 1.2.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Вопрос ваш, на мой взгляд, о применении MVC - Model, View, Controller ( "структура" здесь не при чем и вообще не из лексикона java. Это обьекты. )

Какие модели создавать зависит от многих вещей и "ресурсоемкость" не всегда главная. В вашем случае можно предположить, что "модель списка"  - это Model, а "модель таблиц" - это локальная модель View. 

В общем случае надо создавать и то, и другое. Например, в приложении еще не открыта ни одна таблица, но данные загружаются с сервера. Эти данные укладываются в "модель списка". Загруженные данные можно просматривать разными View (таблица, график). Возможно открыть несколько однотипных View с разными параметрами. Например, одни и те же данные отображать одновременно в двух одинаковых таблицах с разным порядком сортировки. Или с разными фильтрами.  Поэтому локальные "модели" имеют смысл.  

Цитата

как синхронизировать 

Главное правило, это обновлять отображаемые данные ( те, что в "модель таблиц" ) через Event Dispatch Thread. Чтобы не было конфликта с перерисовками экрана, инициированными активностью пользователя. Если в целях экономии памяти отказаться от локальных моделей, т.е. чтобы таблица методом getValueAt брала данные из основного хранилища, т.е. "модель списка", то эту модель также надо обновлять через EDT. A это удобно только в случае, если изменения данных идут от пользователя. Они тогда и так уже в EDT. Но это частный случай. Обновления могут асинхронно приходить извне. С сервера, например.

 PS Для снижение расхода памяти применяют кеш системы. Редко используемые данные автоматически удаляются из памяти (существуют разные правила), а при необходимости подгружаются с локального диска обратно в память. 

Это сообщение отредактировал(а) COVD - 1.2.2011, 19:58
PM MAIL   Вверх
Gugle
Дата 2.2.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, COVD.
Я возьму паузу в диалоге.

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

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

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


 




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


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

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