すがブロ

sugamasaoのhatenablogだよ

JDK5の機能(4)

前回→id:seiunsky:20060710:1152554993
地味だけど便利編。
AutoBoxing機能について。
C#にはあったりするんだけど、ざっくり言うとプリミティブ型とそのラッパークラスでの型変換が暗黙のうちにできる機能。
たとえば、int型のラッパークラスとして、Integer型があるんだけど、ArrayListとかってObject型とかのクラスじゃないと値を持つことができないからArrayList.add(int型)とかはできない。だから、以前(J2SDK 1.4)では↓のような構文はコンパイルエラーだった。

int i = 10;
List list = new ArrayList();
list.add(i);  // コンパイルエラー!!

そうだったんだけど、JDK5からはコンパイル時に暗黙的に変換してくれるようになったので、上記のような構文はコンパイルエラーにはならなくなった。
以下のコードは正常にコンパイル・実行ができる。また、上のメソッドと下のメソッドは実質等価のコードになる(はず)。

public static void testAutoBoxing() {
	Integer integer = new Integer[10000];
	
	for (int i = 0; i < 10000; i++) {
		integer[i] = i;
	}
}

public static void testManualBoxing() {
	Integer integer = new Integer[10000];
	
	for (int i = 0; i < 10000; i++) {
		integer[i] = Integer.valueOf(i);
	}
}

正しさを証明するために例のごとくjadを使って逆コンパイルした結果が↓

public static void testAutoBoxing()
{
    Integer integer = new Integer[10000];
    for(int i = 0; i < 10000; i++)
        integer[i] = Integer.valueOf(i);
}

public static void testManualBoxing()
{
    Integer integer = new Integer[10000];
    for(int i = 0; i < 10000; i++)
        integer[i] = Integer.valueOf(i);
}

結局、二つのメソッドは同じ動作になってしまった。
というわけで、ジェネリクスの時と同じでコンパイラががんばってくれる部分なので速度がどう、という問題はなく、単にプログラマが楽に作業ができる、っていう機能だと言える*1
ただ、きちんと学習しないと、プリミティブ型とラッパークラスの区別がつかない危険な人が増えるかもしれない。。。

*1:そこら辺、意識しておかないと無意識にBoxingが働いて無駄な処理をしてしまう可能性もあるかなぁ