JDK1.4と1.5の違い(Vector)


JDKのバージョンで違う仕様についてVectorクラスを例に挙げて紹介します.

Vectorクラス



 Vectorはオブジェクトの可変長配列を実装します.固定長の通常の配列と違い, 配列の長さが決まっていないためオブジェクトの追加・削除が容易となるメリットがあります.またVectorにはオブジェクト(Java.lang.Objectを継承しているもの全て)であれば何でも配列を作成することができます.一見,このどんなオブジェクトでも配列が作れるのは便利そうに聞こえるかもしれませんが,大きな問題もあります.

 例えば, String型とInteger型のオブジェクトがVectorに混在することが可能になります.Vectorからオブジェクトを取り出すときは, 取り出したいオブジェクトの型にキャストして取り出さなくてはなりません.このとき,取り出したオブジェクトがStringなのかIntegerなのか判断することはできません.本来Integer型のオブジェクトなのに,String型にキャストしてしまうという可能性があるということです.気をつけてプログラミングをすれば避けられる問題ですが,このように違うオブジェクトがVectorに入っていても特にエラーにはならないため,誤って違うオブジェクトをVectorに追加ということも十分に有り得ることです.

 そもそも取り出すときにいちいちキャストしなければならないというのはプログラマにとって面倒くさいものです.さらに,違うオブジェクト同士をVectorのような配列として扱って何かしたいという要求はほとんどなく,もしあったとしても違うオブジェクトを同じ配列で扱うのは設計的に見ても悪いので見直す必要があるように思います.

 そこでJDK 1.5のバージョンからGenericsが導入されました.APIで<E>という表記がGenericsのことです.これは,Vector<String>と書くことで,そのVectorはStringのVectorであることを明記しています.これによって,Vectorへの要素の追加の際にString以外のオブジェクトが追加されたらコンパイラがエラーを検出してくれます.またVectorから要素を取り出す際にはいちいちキャストをしなくてもStringオブジェクトを取り出すことができるようになります.

 このようにVectorはJDK1.5からGenerics対応になったため,1.4とは若干仕様が異なっています.

public class VectorTest
{
   public static 





最終更新:2008年04月12日 17:46
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。