int 型変数を Integer オブジェクトにするメリットは - @IT

http://www.atmarkit.co.jp/fjava/javatips/165java050.html

記事の内容がちょっと気になったので書いて見る。
私自身が勘違いしている可能性もある(?)ので、要注意(汗

まず、int型の値をIntegerオブジェクトにラップすることで利用できる、Integerクラスの提供する機能の活用例を示しましょう。

 下記は、int型の値をオブジェクトと比較可能なら比較し、でなければ比較不可と返すメソッドです。IntegerクラスのcompareToメソッドを使っています。compareToメソッドは、オブジェクトが Integer の場合は大小比較を行い、そうでない場合は、ClassCastException がスローされます。


  (ソースコード)


ラップすることで、IntegerクラスのcompareToメソッドを利用するプログラムの一例

んー、なんか compareTo メソッドが存在する事が Integer の利点であるかのような説明ですね。
利点とかではなく、順序付けが可能という特徴だと思うのですが。

対象が Comparable なオブジェクトであれば、汎用的に適用できるロジックがあった場合等に int -> Integer としてから、そのロジックに渡すというならわかるんですが、ただ compareTo を使いたいためだけに、 int -> Integer に変換するのは無いかなと。

また、メソッドのパラメータにプリミティブ型を用いると値渡しになりますので、オブジェクトのように参照渡しができず、値のコピーが行われるため、効率が低くなります。これらを解決するのも、Integerのようなラップクラスです。

しないしない。*1

たしかに int をメソッド引数とした場合、値のコピーが行われます。

しかし引数型をラッパクラスにした場合はオブジェクト内の値のコピーは行われませんが、オブジェクト参照値の仮引数へのコピーが行われます。さらに、int を使う場面でわざわざ Integer のオブジェクトを作成した場合、オブジェクト生成の分、余分にコストがかかるかと思われます。

public static void main(String[] args) {
  int primitiveValue = 1;
  
  // (1) Integer オブジェクト生成のコスト発生*2
  Integer wrappedValue = Integer.valueOf(primitiveValue);

  // (2) wrappedValue が保持するオブジェクトの参照値が func(Integer value) の value にコピーされる
  func(wrappedValue);

  System.out.println("value: "+wrappedValue);
}

public static void func(Integer value) {
  System.out.println("value: "+value);
  value = Integer.valueOf(100);// (3) 呼び出し元変数の指し示す先は変わらない
}

例えば上記のプログラムを実行した場合、 (1) の部分で Integer オブジェクト生成のコストが発生します。*3
そして、(2) の部分では、引数がプリミティブだろうがオブジェクトだろうが、仮引数へのコピーが発生します。プリミティブの場合は値のコピーが、オブジェクトの場合はオブジェクトを示す参照値のコピーが発生します。

蛇足ですが、オブジェクトの参照値がコピーされているため、(3) の部分で変数値を変更しても呼び出し元の変数値は変更されません。あたりまえですが。
ですので、上記プログラムの実行結果は以下のようになるはずです。*4

value: 1
value: 1

ラップクラス活用の一例として「float型の値を与えると、その値の小数点以下が0であればint型の整数として表示し、そうでなければfloat型の実数として表示する」プログラムを作成しました。int型とfloat型の戻り値を同時に持つメソッドはできませんし、2つのメソッドにしてオーバロードしようにも、どちらも同じfloat型の引数ですから、うまくいきません。そこで、Integerクラスと、Floatクラスを使い、双方を扱えるObjectクラスを戻り値とする1つのメソッドにしたのが下図のプログラムです。


  (ソースコード)


ラップしてオブジェクトにすることで、intとfloatの戻り値を持つメソッドが実現

 このように、Integerのようなラップクラスを活用することによって、オブジェクトにのみ可能なメリットが得られるわけです。

( ゚д゚)ポカーン

なんでもかんでも Object で返せるのがメリットになってない?でも結局 instanceof で型をみるんだよね・・・メリットといってしまうのどうかと。
実案件でこんなメソッドが作られたら、即、作り直しではないかと。

*1:それとも、最適化とかでなにかあるのかな?

*2:valueOf の実装にもよるけどね

*3:Integer オブジェクトを使用しない場合に比べてということです

*4:すみません、実際に動作させていません