【コラム】

ライトニングJava

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

 

21/75

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、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

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

21/75

インデックス

連載目次
第75回 成熟を続けるJavaテクノロジ - そして、次のステージへ
第74回 Java SE 6へ - 継続されるEoD、スクリプト、デスクトップ強化…
第73回 JSPプログラミング(4) - アクション
第72回 JSPプログラミング(3) - 暗黙オブジェクト
第71回 JSPプログラミング(2) - 宣言、スクリプトレット、式
第70回 JSPプログラミング(1) - ディレクティブ
第69回 JSP(2) - JSPはServletに変換されて実行される
第68回 JSP(1) - JSP、PHP、ASPって結局なに?
第67回 Servletプログラミング(7) - リスナ、Webアプリケーションフレームワークへ
第66回 Servletプログラミング(6) - フォワード、インクルード、リダイレクト
第65回 Servletプログラミング(5) - フィルタ、連続したフィルタの適用
第64回 Servletプログラミング(4) - データスコープ、HTTPリクエスト/レスポンスヘッダ
第63回 Servletプログラミング(3) - Webアプリケーションの初期値、サーブレットの初期値
第62回 Servletプログラミング(2) - GET/POST、日本語の扱いについて
第61回 Servletプログラミング(1) - セッション制御
第60回 Servlet(4) - Webアプリケーションの配布にはWARファイル
第59回 Servlet(3) - Webアプリケーションサーバ基礎(2)おさらい
第58回 Servlet(2) - Webアプリケーションサーバ基礎(1)おさらい
第57回 Servlet(1) - Javaをネットワークプログラミング言語へと誘った技術
第56回 HTTP通信の基礎(3) - HTTPS通信、HttpsURLConnection
第55回 HTTP通信の基礎(2) - URLEncoder、URLDecoder
第54回 HTTP通信の基礎(1) - URIとURL、URLConnection
第53回 UDP(2) - データグラム通信 実装例 詳細説明
第52回 UDP(1) - データグラム通信 実装例
第51回 ネットワークプログラミング(6) - ServerSocketを使った実装例 NewIO編(2)
第50回 ネットワークプログラミング(5) - ServerSocketを使った実装例 NewIO編(1)
第49回 ネットワークプログラミング(4) - ServerSocketを使った実装例 スレッド編
第48回 ネットワークプログラミング(3) - Socketを使った実装例 詳細説明(2)
第47回 ネットワークプログラミング(2) - Socketを使った実装例 詳細説明(1)
第46回 ネットワークプログラミング(1) - Socketを使った実装例
第45回 ソケット(4) - Javaにおけるソケット
第44回 ソケット(3) - Cの実装で学ぶソケットの基礎知識
第43回 ソケット(2) - プログラミング言語に左右されないインタフェース
第42回 ソケット(1) - ネットワークインタフェース
第41回 Javaネットワークプログラミング事始 - TCP/IPからEJB/WebServiceまで
第40回 AspectJ 5(5) - アスペクトを活かす
第39回 AspectJ 5(4) - 逆コンパイルで探るアスペクトの裏側@Aroundの実態
第38回 AspectJ 5(3) - 逆コンパイルで探るアスペクトの裏側
第37回 AspectJ 5(2) - メソッドの実行時間を測定する
第36回 AspectJ 5(1) - JavaでAOPを実現する
第35回 アスペクト指向(3) - AOPを適用するべきか否か
第34回 アスペクト指向(2) - 横断的関心事を知る
第33回 アスペクト指向(1) - 新しいプログラミングの形、アスペクト指向
第32回 アノテーション(7) - 採用事例 TestNG(4)
第31回 アノテーション(5) - 採用事例 TestNG(3)
第30回 アノテーション(5) - 採用事例 TestNG(2)
第29回 アノテーション(4) - 採用事例 TestNG(1)
第28回 アノテーション(3) - アノテーションを知る(2)
第27回 アノテーション(2) - アノテーションを知る(1)
第26回 アノテーション(1) - Javaの大きな変貌、アノテーションの導入
第25回 Generic Java(6) - Genericを使ってAPIを作成する その3
第24回 Generic Java(5) - Genericを使ってAPIを作成する その2
第23回 Generic Java(4) - Genericを使ってAPIを作成する その1
第22回 Generic Java(3) - 逆コンパイルで探るGeneric Javaの裏側
第21回 Generic Java(2) - Generic Javaの使用例その1
第20回 Generic Java(1) - 賛否両論? ジェネリックプログラミングとは
第19回 地味だけど便利! - Static Import
第18回 拡張for構文(3) - EoDによってもたらされたもの
第17回 拡張for構文(2) - 逆コンパイルで探る拡張for構文の裏側
第16回 拡張for構文(1) -実装に沿った読みやすい記述を実現~拡張for構文の導入
第15回 列挙型(4) - 逆コンパイルで探る列挙型の裏舞台
第14回 列挙型(3) - クラスで実現される列挙型
第13回 列挙型(2) - 列挙型を調べる
第12回 列挙型(1) - 列挙型の導入
第11回 可変長引数(5) - 引数の位置とAutoboxing/Unboxingとの連帯
第10回 可変長引数(4) - 逆コンパイルで探る可変長引数の裏舞台
第9回 可変長引数(3) - 配列で実現される可変長引数
第8回 可変長引数(2) - 書式つき出力 printf を調べる
第7回 可変長引数(1) - 書式つき出力 printf の導入
第6回 EoDの裏にある互換性ということ(3) - 逆コンパイルで探る舞台裏
第5回 EoDの裏にある互換性ということ(2)
第4回 EoDの裏にある互換性ということ(1)
第3回 Autoboxing/Unboxing機能(2) - Autoboxing/Unboxingの仕組みとは?
第2回 Autoboxing/Unboxing(1) - プリミティブ型をコレクションフレームワークで
第1回 変わりゆくJava - Easy of Development

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

宇宙人のメッセージ? - 太陽系から94光年離れた恒星系より"強い信号"を受信
[09:24 8/31] テクノロジー
【特別企画】若手にこそ新製品開発のチャンスを- 老舗切削工具メーカータンガロイ社員に直撃
[09:00 8/31] テクノロジー
無償でもこんなに使える! LibreOffice基本講座 第9回 タイトルや見出しで移動する
[09:00 8/31] 企業IT
ゼロからわかるEMC 第5回 EMCの試験 - EMS
[09:00 8/31] テクノロジー
受動喫煙による肺がんリスクは約1.3倍 - 国がんが日本人を対象に解析
[08:30 8/31] テクノロジー

求人情報