Java5の新機能を学ぶ

2007/10/14

遅ればせながら、Java5の新機能を学ぶ。

JavaWorld最終号を参考に、1.4から変わった機能を試してみた。
1.4まで不便に感じてたところが便利になってるし、スクリプト言語からの影響も垣間見え、
EoDな方向性が出ていると感じました。


  • Generics

  • ListやMapなどのコレクションに格納するオブジェクトの型を予め決めておくことができ、キャストが不要になったり、コンパイル時に型チェックできるようになる。
    //Java5以前
    List list1 = new ArrayList();
    Integer count1 = new Integer(256);
    list1.add(count1);
    System.out.println(((Integer)list1.get(0)).intValue());

    //Genericsを使った例
    List<Integer> list2 = new ArrayList();
    Integer count2 = new Integer(256);
    list2.add(count2);
    //list2.add("string"); Integer以外をaddしようとするとコンパイルエラー
    System.out.println(list2.get(0).intValue());   //キャスト不要!

    これは便利ですな。

    Mapやメソッド定義も同様です。
    Map<String, List<String>> map = new HashMap();

    public List<String> getXX(List<Integer> target) {
        ....
    }


  • Autoboxing/Unboxing

  • intやcharなどのプリミティブ型とそれに対応するIntegerやCharacterなどのラッパークラスとの間で、相互の変換を自動でやってくれる機能。
    上のGenericsの例にAutoboxingを加えると、
    //AutoBoxingも使った例
    List<Integer> list3 = new ArrayList();
    list3.add(256);                   //intで指定できる
    System.out.println(list3.get(0));   //intValue()も不要

    となり、ずいぶんすっきりしました。

  • 拡張for文

  • Enhanced For Loop。スクリプト言語のfor~in-みたいな感じ。
    for (取り出す要素 : 配列やコレクション) {
      //処理
    }
    の形式で書く。
    //拡張for文
    List<Integer> list4 = new ArrayList();
    list4.add(256);
    list4.add(256*256);
    list4.add(256*256*256);
    for (Integer count : list4) {
        System.out.println(count);
    }

    スクリプト言語のようなお手軽さがありますね。

  • Enum

  • 列挙型。ついにJavaにも。
    public enum Lang {JAVA, RUBY, PHP};
    Lang lang = Lang.valueOf("RUBY");
    switch (lang) {
        case JAVA:
    System.out.println("Struts");
    break;
        case RUBY:
    System.out.println("Rails");
    break;
        case PHP:
    System.out.println("Akelos");
    break;
    }

    さらには定数ごとに異なる実装のメソッドを保持することもできます。
    また、java.utilにEnumMapやEnumSetなるものもあるようです。
    詳しくはココ

  • 可変長引数

  • メソッド引数の数を可変にできる。
    可変な引数は配列として扱う。固定と可変の引数が混在する場合は、可変な引数は最後でなければならない。
    method(Object... obj){
    }
    の形式で書く。
    public static void main(String[] args) {
        System.out.println(getArgsLength("a"));
        System.out.println(getArgsLength("a", "b"));
        System.out.println(getArgsLength("a", "b", "c"));
    }
    private static int getArgsLength(String... obj) {
        return obj.length;
    }

    実行結果
    1
    2
    3

  • static import

  • importを変数やメソッドまでに広げるようなもの。
    static importすると、他のクラスのメソッドをいきなり書けるようになる。
    でも、どこの変数なのか、どこのメソッドなのかがわかりにくくなるので、全く使おうとは思わないが。。
    使いどころってどういうときなんだろう。。

  • アノテーション

  • これは、DIコンテナとも関わりがありそうだし、肝っぽいので、またの機会にする。

Java | コメント(0) | トラックバック(0)
トラックバック
トラックバックURL:
コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)