不変クラスのキャッシュ

Java5からInteger#valueOf(int)メソッドが増えました。
これの利点は、-127〜128については、内部でキャッシュされたものが返されるため、生成コストが低いということ。ということで、Integerが欲しい時は、new Integerではなく、必ずInteger.valueOfを使うようにしよう。不変クラスなので、同じインスタンスが返ってきてもなんら問題ないはず。
一応実験。もちろんtrueになります。

System.out.println(Integer.valueOf(1) == Integer.valueOf(1));

ただし、これはtrueにならないので注意が必要です。

System.out.println(Integer.valueOf("1") == Integer.valueOf("1"));

なんでやろーと思ったのですが、Integer#valueOf(String)は以前より存在し、もともとこれが呼ばれたときは内部でnew Integerして返すようになっていました。5.0からキャッシュしたものを返すようにすると、今までの仕様と変わってしまうから、触らなかったんでしょうね。


ちなみにオートボクシングはどうなっているか気になったので、次のコードを作成し、逆コンパイルしてみました。

int i = 0;
new ArrayList<Integer>().add(i);

期待通り、Integer.valueOf(i)を使うようになっていました。
そのほかのBooleanなどもnew Boolean(boolean)する方法とBoolean#valueOf(boolean)が提供されていますが、基本、すべてvalueOfを使うと覚えていて問題ないはずです。