Почему Java DefaultTableModel использует вектор?

#java #swing #jtable #tablemodel

#java #swing #jtable #табличная модель

Вопрос:

Я знаю, что мы должны использовать AWT thread для всех операций обновления табличной модели. В рамках одного потока AWT любая табличная модель будет потокобезопасной. Почему DefaultTableModel выбирает потокобезопасный вектор в качестве структуры данных, которая медленнее, чем другие структуры данных, такие как ArrayList?

Комментарии:

1. вы измеряли «медленнее»? Предполагаемая (неправильная) производительность оказывает ровно нулевое влияние на производительность 🙂

Ответ №1:

Swing впервые появился до Java 1.2, то есть до ArrayList того, как был доступен. К сожалению, API для DefaultTableModel раскрывает тот факт, что он использует Vector , поэтому изменение его сейчас было бы несовместимо с обратным.

Это именно та причина, по которой стоит тщательно подумать об инкапсуляции — это позволяет вам изменить внутренние компоненты позже. (По общему признанию, правильная сериализация была бы интересной, но это история для другого дня …)

Ответ №2:

Swing был доступен для Java 1.1, но не включен в нее. List / ArrayList был представлен в 1.2. Жаль, потому что Swing не помешало бы потратить немного дополнительного времени перед блокировкой API.

Ответ №3:

Причина уже была объяснена выше (Swing существовал до библиотеки java.util Collections).

Суть такова: никогда не используйте DefaultTableModel , а лучше создайте свою собственную (на основе AbstractTableModel ).

Комментарии:

1. Я не согласен с советом никогда не использовать DefaultTableModel. Только заново изобретайте колесо с AbstractTableModel, когда это необходимо. Существует множество случаев, когда использование DefaultTableModel не повредит.

2. @jzd Что ж, если вам нравится определять вектор Vector of Object или объект[][], то это зависит от вас, но вам не хватает безопасности типов и удобочитаемости кода. За всю мою жизнь разработчика Swing я никогда не использовал DefaultTableModel (за исключением глупых примеров кода). Написать свою собственную просто, в то время как использование GlazedList в целом работает намного лучше.

3. @jzd, @jfpoilpret — в основном дело вкуса, есть плюсы и минусы для обоих 🙂 Реализовать надежную модель нетривиально (для начала). В большинстве случаев это не повредит, только выглядит ооочень ретро, если просто использовать значение по умолчанию. Мой итог: используйте то, что доступно, пока действительно не понадобится пользовательская реализация.

4. @jzd, я не согласен с твоим советом 🙂 Модель должна содержать данные в удобном для конкретного домена формате. Вектор различных типов не является надлежащим объектом модели.

5. @jfpoilpret, я согласен, что если у вас нет массивов объектов или векторов, то DefaultTableModel менее привлекательна. Я считаю, что «никогда не использовать» — это слишком сильное утверждение.

Ответ №4:

Я собираюсь догадаться, что DefaultTableModel класс был на самом деле разработаны до коллекции рамок (куда входит ArrayList класс) было введено в Java-поэтому DefaultTableModel класс не был реализован с помощью классов вводится в рамках коллекции рамок.

Вот несколько фактов:

Кроме того, использование Vector в качестве базовой структуры данных DefaultTableModel классом является деталью реализации, поскольку TableModel сам интерфейс не зависит от использования Vector .

Комментарии:

1. Спасибо за все ответы. Я бы хотел, чтобы они могли изменить реализацию в более поздней версии.

2. @user729309 На самом деле, я не уверен, что изменение его на ArrayList вместо Vector приведет к резкому увеличению производительности (за исключением случаев, когда у вас много строк, но в этом случае у вас все равно уже есть проблемы с производительностью и памятью).

3. @jfpoilpret — без измерения это приводит к ровно нулевому увеличению 😉