すべてのテーブル モデルの更新操作に AWT スレッドを使用する必要があることはわかっています。単一の AWT スレッドでは、すべてのテーブル モデルがスレッド セーフになります。DefaultTableModel がデータ構造としてスレッドセーフな Vector を選択するのはなぜですか? これは ArrayList のような他のデータ構造よりも遅いのですか?
4 に答える
SwingはJava1.2より前に最初に登場したため、以前ArrayListは利用可能でした。残念ながら、のAPIは、を使用しているという事実をDefaultTableModel 公開Vectorしているため、今すぐ変更すると、下位互換性がなくなります。
これはまさに、カプセル化について慎重に考える理由の一種です。後で内部を変更することができます。(確かに、シリアル化を正しく行うことは興味深いことでしたが、それは別の日の話です...)
SwingはJava1.1で利用可能でしたが、Java1.1には含まれていませんでした。List/ArrayListは1.2で導入されました。残念ながら、SwingはAPIをロックダウンする前に少し余分な時間を費やしていた可能性があります。
その理由はすでに説明済みです (Swing は java.util Collections ライブラリの前に存在していました)。
肝心なのは、決して使用DefaultTableModelせずに独自のものを作成することです (に基づいてAbstractTableModel)。
このクラスは、Collections Framework(クラスを含む)がJavaで導入さDefaultTableModelれる前に実際に開発されたと推測します。したがって、このクラスは、CollectionsFrameworkの一部として導入されたクラスを使用して実装されていません。ArrayListDefaultTableModel
ここにいくつかの事実があります:
DefaultTableModelJava1.2で導入されましたArrayListJava1.2で導入されましたVectorJDK1.0で導入されました
さらに、インターフェース自体はの使用法に依存しないため、クラスVectorによる基礎となるデータ構造としてのaの使用は実装の詳細です。DefaultTableModelTableModelVector