Java > ラッパークラスの使い方

更新日 2011-12-3
広告
Javaには、プリミティブ型(intやdoubleなど)をラップするクラス(IntegerやDouble)が用意されています。 それらのクラスのことをラッパークラスと呼びます。
ラッパークラスは、(あたりまえですが)プリミティブ型と、異なる点があります。以下、それを説明します。

・その1: メソッドを持っている

ラッパークラスは、クラスなので、メソッドを持っている。 例えば、文字列からラッパークラスに変換するメソッドがあります。便利です。
public class WrapperTest {
    public static void main(String[] args) {
    	String strInt = "12345";
    	Integer a = Integer.parseInt(strInt);
    	System.out.println("a == " + a);

    	String strBool = "true";
    	Boolean b = Boolean.parseBoolean(strBool);
    	System.out.println("b == " + b);
    }
}
上記のサンプル WrapperTest を実行すると、以下の結果になります。
WrapperClass$ java WrapperTest 
a == 12345
b == true

このように、文字列から数値や真偽値に変換できます。

・その2: 等値比較に注意

ラッパークラスを、プリミティブ型のようにif文で比較することは危険です。 次のサンプル WrapperTest2 では、2つのIntegerオブジェクトaとbを、比較しています。
public class WrapperTest2 {
    public static void main(String[] args) {
    	Integer a = 12345;
    	Integer b = 12345;

    	// == で比較
    	if (a == b) {
    	    System.out.println("a == b");
    	} else {
    	    System.out.println("a != b");
    	}

    	// intValueメソッドの結果を比較
    	if (a.intValue() == b.intValue()) {
    	    System.out.println("same value");
    	} else {
    	    System.out.println("NOT same value");
    	}
    }
}
WrapperTest2を実行すると、以下のようになります。
WrapperClass$ java WrapperTest2 
a != b
same value
==で比較した結果、aとbは違うと判定されました。 これは、aとbが、別々のオブジェクトだからです。 そして、==による比較は、オブジェクトの同一性を比較するからです。
ラッパークラスが保持しているプリミティブ値は、サンプルのように intValue メソッドなどを利用して取得できます。

・その3: nullになりえる

ラッパークラスはオブジェクトなので、nullを設定できます。 これを利用して、例えば「ふだんは数値を返すけど、エラーが発生したらnullを返す」というメソッドを実装できます。
一方、「数値だと思っていたら実はnullだった」という状況も発生します。 以下のサンプル WrapperTest3 は、故意にその状況を作り出しています。
public class WrapperTest3 {
    public static void main(String[] args) {
    	Integer a = 12345;
    	Integer b = null;

    	try { // nullの演算
    	    Integer c = a + b;
    	} catch (NullPointerException e) {
    	    System.out.println("NullPointerException occured at (a + b)");
    	}

    	try { // nullの代入
    	    int c = b;
    	} catch (NullPointerException e) {
    	    System.out.println("NullPointerException occured at (c = b)");
    	}
    }
}

実行結果は以下のようになります。
WrapperClass$ java WrapperTest3 
NullPointerException occured at (a + b)
NullPointerException occured at (c = b)
演算も代入も、どちらもNullPointerExceptionが発行されました。 このように、ラッパークラスはnullになりえることに注意する必要があります。
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system