Java/オートボクシング

出典: フリー教科書『ウィキブックス(Wikibooks)』

Javaのオートボクシング( autoboxing )とは、プリミティブ型(int、double、booleanなど)の値をラッパークラス(Integer、Double、Booleanなど)のオブジェクトに自動的に変換する機能です。 また、逆にラッパークラスのオブジェクトからプリミティブ型の値に変換する際も、自動的に行われます。 なお、オートボクシングはJDK 1.5以降で利用可能です。

オートボクシングの利点としては、以下のようなものがあります。

  1. コードが簡潔になる:プリミティブ型とラッパークラス間の変換を明示的に行う必要がなくなるため、コードが簡潔になります。
  2. ヌル値を扱いやすくなる:ラッパークラスには、nullを表す値が存在します。オートボクシングによって、プリミティブ型にnullを代入することができないため、プログラマーはnullを扱いやすくなります。
  3. ジェネリックスを使いやすくなる:ジェネリックスでは、プリミティブ型を利用することができませんが、ラッパークラスを使用することができます。オートボクシングによって、コードを簡潔に書くことができます。

しかし、オートボクシングには以下のような問題点もあります。

  1. パフォーマンスが低下する可能性がある:プリミティブ型とラッパークラスの変換は、コンパイラによって自動的に行われますが、この変換にはコストがかかります。大量のデータを処理する場合、オートボクシングがパフォーマンスの低下を引き起こす可能性があります。
  2. 予期しない値が生成される可能性がある:オートボクシングによって、予期しない値が生成される可能性があります。例えば、int型の値をIntegerクラスに変換する際に、値がnullである場合、NullPointerExceptionが発生する可能性があります。
  3. メモリ使用量が増加する可能性がある:ラッパークラスはオブジェクトであり、メモリ使用量が増加する可能性があります。大量のデータを処理する場合、メモリ使用量が問題になることがあります。

以下は、Javaでのオートボクシングのコード例です。

int number = 10;  // プリミティブ型の変数を宣言
Integer wrapperNumber = number;  // オートボクシングにより、プリミティブ型の値がラッパークラスのオブジェクトに自動変換される

System.out.println(wrapperNumber);  // 出力: 10

Double doubleNumber = 3.14;  // ラッパークラスのオブジェクトを宣言
double primitiveDoubleNumber = doubleNumber;  // オートボクシングにより、ラッパークラスのオブジェクトがプリミティブ型の値に自動変換される

System.out.println(primitiveDoubleNumber);  // 出力: 3.14
上記のコードでは、int型の変数numberを宣言し、その値をInteger型のオブジェクトwrapperNumberに代入しています。
これにより、プリミティブ型の値が自動的にラッパークラスのオブジェクトに変換されます。
また、Double型のオブジェクトdoubleNumberを宣言し、その値をdouble型の変数primitiveDoubleNumberに代入しています。
これにより、ラッパークラスのオブジェクトが自動的にプリミティブ型の値に変換されます。

以下のコードは、オートボクシングを使わない例です。

int number = 10; // プリミティブ型の変数を宣言
Integer wrapperNumber = new Integer(number); // 明示的にラッパークラスのオブジェクトを生成する

System.out.println(wrapperNumber); // 出力: 10

Double doubleNumber = new Double(3.14); // ラッパークラスのオブジェクトを宣言
double primitiveDoubleNumber = doubleNumber.doubleValue(); // 明示的にラッパークラスのオブジェクトからプリミティブ型の値を取得する

System.out.println(primitiveDoubleNumber); // 出力: 3.14