#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
класс не был реализован с помощью классов вводится в рамках коллекции рамок.
Вот несколько фактов:
DefaultTableModel
был введен в Java 1.2ArrayList
был введен в Java 1.2Vector
был введен в JDK 1.0
Кроме того, использование Vector
в качестве базовой структуры данных DefaultTableModel
классом является деталью реализации, поскольку TableModel
сам интерфейс не зависит от использования Vector
.
Комментарии:
1. Спасибо за все ответы. Я бы хотел, чтобы они могли изменить реализацию в более поздней версии.
2. @user729309 На самом деле, я не уверен, что изменение его на ArrayList вместо Vector приведет к резкому увеличению производительности (за исключением случаев, когда у вас много строк, но в этом случае у вас все равно уже есть проблемы с производительностью и памятью).
3. @jfpoilpret — без измерения это приводит к ровно нулевому увеличению 😉