|
Autoboxing/Auto-Unboxing |
||||
|
||||
私はひそかに JSR-201 の中で、1 番簡単に使えてかつ 1 番便利なのが Autoboxing だと思っています。ここで書いている時点でひそかでも何でもないですが... なにはともあれ、便利です。 何をやってくるかというと、プリミティブとそのラッパークラス間の変換を自動でやってくるのです。どういうことかというと、こんなことです。
こんなことができたらすごいと思いません ? ちなみに Autoboxing が プリミティブ -> ラッパ の自動変換、Auto-Unboxing が ラッパ -> プリミティブの自動変換のことです。
|
|
|||||||
何といわれようが、コレクションです。 コレクションは便利なのですが、プリミティブ型の値を保持することはできません。その代わりにラッパを使用するのはご存知の通り。
これが Autoboxing を使えば、次のように書けます。
プリミティブな値を直接コレクションに add しているように見えますが、実際は Autoboxing によって Integer オブジェクトに変換されます。 それでも、格段に楽になると思いませんか。 気をつけなくてはいけないのは、例えば List#remove メソッドのように引数が int と Object のものがあるばあい、引数が int だったら Autoboxing はされません。当たり前ですね。
メソッドの引数だけでなく戻り値もちゃんと変換してくれます。
もちろん、ラッパとプリミティブを直接代入することもできます。
これでラッパとプリミティブを意識することなしに使用することができます。 |
|
||||
コンパイラがどのように解釈しているかは大体分かりますね。それでも一応逆コンパイラの Jad を使って確かめてみましょう。 逆コンパイルしたのは先ほどのサンプル Autoboxing3 クラスです。これを Jad で逆コンパイルすると
Integer を int に変換するときには Integer#intValue メソッドを使用し、int から Integer に変換するときには Integer.valueOf メソッドが使われていることが分かります。 すなわち、見た目はラッパとプリミティブを区別なく使用できたとしても、パフォーマンス的には今までと何も変わらないということです。 逆にいえば、プリミティブとラッパを意識しないぶん、Autoboxing を知らずに使うとパフォーマンスダウンの原因になりうるということです。なにごともやりすぎはよくないということですね。
|
|
||||
Autoboxing は簡単だけども、使える機能です。 コレクションでいちいちラッパオブジェクトを生成することだけでも得をした気分になるものです ^^;; でも、使いすぎには注意しましょう。
今回使用したサンプルはここからダウンロードできます。 参考
(Dec. 2003) |
|