Lesson 6: JDK 5

JDK 5で拡張された機能
今更なの...(いつも通りこの色は美樹ちゃん)
ほほほほ。とっても久しぶりに Java を扱ったのでちょっとだけまとめておくね。ちょっとだけ・・・

Section 1: Generics

今までの書き方、コレクションは要素を Object クラスのオブジェクトとして保持するので、いちいちキャストを行わなくてはならなかった。

List list = new ArrayList();
list.add(new Integer(10));
int iValue = ((Integer)list.get(0)).intValue();    // キャストが必要

でも、Generics を使うととってもわかりやすくなる

List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(10));
int iValue = list.get(0).intValue();               // キャストが不要

へえ〜 C++のテンプレートみたいなのね

そうだね〜似たような感じだね。Javaの場合、この Genericsのおかげでずいぶんと奇麗なコードかつ安全な記述が出来るようになったね。文字列のリストを利用する時などとってもわかりやすい記述になったんじゃないかな〜

import java.util.ArrayList;
import java.util.List;

public class Sample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < args.length; i++) {
            list.add(args[i]);                 // 型チェックが行われる
        }
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < list.size(); i++) {
            String sValue = list.get(i);          // キャストが不要
            buffer.append(sValue);
        }
        System.out.println(buffer);
    }
}

Section 2: foreach ?

Iteratorを利用して while/for 文を記述していた部分が簡単になる

    List list = new ArrayList();
    ...
    Iterator it = list.iterator();
    while (it.hasNext()) {
        Integer iValue = (Integer)it.next();
        System.out.println(iValue);
    }

とってもシンプルになる

    List list = new ArrayList();
    ...
    for (Integer i : list) {
        System.out.println(i);
    }

わあ〜 PHPや C# の foreach みたい。便利そうー

Section 3: Enum

C/C++などの enum って便利だけど範囲チェックをしてくれないので微妙な位置だったけど、Javaの enum はとっても便利

public class SeasonEnum {
    enum Season {SPRING, SUMMER, FALL, WINTER}
 
    public static void main(String[] args) {
        Season season = Season.SUMMER;
        System.out.println("Season is " + season);
    }
}

値が出力されずに "SUMMER" となる。比較(==, equals, compareTo)や switch文で扱えるのでとても奇麗なコードになります

    // 比較 ==
    if (season == Season.SUMMER) {
        System.out.println("Suit is SUMMER");
    } else {
        System.out.println("Suit is NOT SUMMER");
    }

    switch (season) {
      case SPRING:
        System.out.println("SPRING");
        break;
      case SUMMER:
        System.out.println("SUMMER");
        break;
      case FALL:
        System.out.println("FALL");
        break;
      case WINTER:
        System.out.println("WINTER");
        break;
    }

じつは、数値型ではなく特殊なクラス(Enum抽象クラスを継承している)なので以下のような使い方も出来る

public class SeasonEnum {
    enum Season {
        SPRING("春"),
        SUMMER("夏"),
        FALL("秋"),
        WINTER("冬");

        private String message;

        private Season(String message) {
            this.message = message;
        }

        public String toString() {
            return (this.message);
        }
    }

    public static void main(String[] args) {
        Season season = Season.SUMMER;
        System.out.println("Season is " + season);
    }
}

"夏"と出力される。

Section 4: 可変長引数

いままでは、任意の個数の値を取るメソッドでは、そのメソッドの呼び出し前に、配列を作成して値を代入する必要があった。たとえば、MessageFormatクラスでは

    Object[] arg = new Object[]{new Integer(10), new Date()};
    String str = MessageFormat.format("{0,number} {1,date}", arg);
    System.out.println(str);

でも、可変長引数のおかげで以下のようなメソッドが用意されたため

public static String format(String pattern, Object... arguments);

以下の用に単純に記述できます。

    String str = MessageFormat.format("{0,number} {1,date}", 10, new Date());
    System.out.println(str);

複数の引数を配列であつかうのに変わり無いけどね・・・

[Prev] [Next]