【コラム】

ライトニングJava

21 Generic Java(2) - Generic Javaの使用例その1

後藤大地  [2005/10/03]

J2SE 5.0に導入されたEoDにGeneric Javaがある。前回、Generic Javaはジェネリックプログラミングを実現するためのテンプレートの一種であることを紹介した。今回は具体的にどのようにGeneric Javaを使用するかを紹介する。

Generic Javaが適用されたAPIを使う

Generic Javaは、対応したクラスを作成する方は面倒だが、使う分には簡単だ。従来のソースコードと比較するとわかりやすいだろう。J2SE 5.0ではコレクションフレームワークAPIがGeneric Javaを使うように書き換えられているので、コレクションフレームワークを使う例を紹介しよう。

まず、J2SE 1.4までで動作するように書いた場合のソースコードをリスト1に示す。これはコレクションにIntegerオブジェクトを保持し、それを取り出して出力するものだ。

リスト1 GJTest.java - J2SE 1.4用に作成した場合

import java.util.ArrayList;
import java.util.Iterator;

public class GJTest {
    public static void main(String[] anyArguments) {
        ArrayList arraylist = new ArrayList();
        arraylist.add(new Integer(1));
        arraylist.add(new Integer(2));
        arraylist.add(new Integer(3));

        int i;
        for (int count = 0; count < 3; count++) {
            i = ((Integer)arraylist.get(count)).intValue();
            System.out.println(i);
        }
    }
}

次に、これをJ2SE 5.0でGeneric Javaを使うように書き換えたソースコードをリスト2に示す。

リスト2 GJTest2.java - J2SE 5.0 Generic Javaを使って作成した場合

import java.util.ArrayList;

public class GJTest2 {
    public static void main(String[] anyArguments) {
        ArrayList<Integer> arraylist = new ArrayList<Integer>();
        arraylist.add(new Integer(1));
        arraylist.add(new Integer(2));
        arraylist.add(new Integer(3));

        int i;
        for (int count = 0; count < 3; count++) {
            i = arraylist.get(count).intValue();
            System.out.println(i);
        }
    }
}

まず注目されるのは、宣言の方法が変わっていることだ。ArrayListの部分がArrayList<Integer>のように変わっている。記述方法の変更という点では、これが一番大きな変更だろう。C++ STLのような記述方法が導入されたわけだ。

リスト3 宣言の書き方に新しい方法が追加された

        ArrayList arraylist = new ArrayList();
            ↓
        ArrayList<Integer> arraylist = new ArrayList<Integer>();   

ArrayListのように宣言した場合、ArrayListコレクションにはオブジェクト型であればどのようなオブジェクトでも代入できる。J2SE 5.0で新しく導入されたGeneric Javaではこれに加えてArrayList<Integer>のような記述ができるようになっている。ArrayList<Integer>のように記述すると、ArrayListが保持できるオブジェクトはIntegerに限定される。

ArrayList<Integer>のように宣言した場合、そのコレクションが保持するオブジェクトはIntegerオブジェクトということが明確になるため、Integerオブジェクトをやりとりするという前提のもとコードが書けるようになる。先ほどのコードを比較すると、リスト4のようにコレクションから取り出したオブジェクトに対してキャスティング処理を行っていないことがわかるだろう。

リスト4 Generic Javaを適用することでキャスティングの必要性が減少

            i = ((Integer)arraylist.get(count)).intValue();
                ↓
            i = arraylist.get(count).intValue();

つまり、EoDという観点でみた場合、Generic Javaが適用されたAPIを使用するにあたっての効能は、まさにこの点にある。Javaソースコードにおけるキャスティングの多さはJ2SE 1.4までは宿命的なものがあった。これまでのJavaの仕組みでは、キャスティングを多用しなければプログラムが作成できなかったのだ。これがGeneric Javaの効果として、キャスティングを行わなくてもよくなったのだ。

Generic Javaを適用されたAPIを使用する利点は他にもあるが、EoDという観点ではこの点がもっとも大きい。また、J2SE 5.0で導入されたGeneric Java以外のEoDも適用してソースコードを書き直したものをリスト5に示しておく。拡張for構文とAutoboxing/unboxing機能を使っている。リスト1と比べると記述がすっきりしていることがわかるだろう。

リスト5 GJTest3.java - J2SE 5.0 ほかのEoDも併用した場合

import java.util.ArrayList;

public class GJTest3 {
    public static void main(String[] anyArguments) {
        ArrayList<Integer> arraylist = new ArrayList<Integer>();
        arraylist.add(1);
        arraylist.add(2);
        arraylist.add(3);

        for (int integer : arraylist) {
            System.out.println(integer);
        }
    }
}

キャスティングが減るということ

Generic Javaが適用されたAPIを使うという観点でいえば、リスト2だけがわかっていればよい。逆にいえば、J2SE 5.0を使っていく場合、最低限でもリスト2は読めて書けるようにしておく必要はあるだろう。

ArrayList<Integer>のように宣言してコレクションで保持するオブジェクトを限定するということは実はとても便利なことなのだが、よくわからない人にはピンとこないかもしれない。コレクションフレームワークを使っていればわかると思うが、コレクションに多種類のオブジェクトを代入しておくということはあまり行わない。理由はかんたんで、それは人が理解しにくいためと、ソースコードが煩雑になるからだ。複数の種類のオブジェクトを保持すると、取り出してからinstanceofで比較してキャスティングするというコードをはさむ必要がでてくる。これは煩雑だ。

こういった理由から、コレクションにはだいたい同じオブジェクトしか保持しないが、J2SE 1.4までのJavaでは、同じオブジェクトしか保持していないにもかかわらず、かならずキャスティングが必要だった。Javaにそのような仕組みがなかったからだ。

J2SE 5.0で導入されたGeneric Javaのおかげで、これを自動処理できるようになった。これは簡単な話のようだが大きなEoDだ。

提供:毎日就職ナビ

会員登録はこちら

学生のための就職情報サイト「毎日就職ナビ」。4,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

毎日コミュニケーションズ 就職情報事業本部はプライバシーマークを取得しています。

    新着記事

    特設サイトの情報

    人気記事

    一覧

    イチオシ記事

    新着記事

    特別企画

    一覧