new BigDecimal(10); BigDecimal.valueOf(10);
も同じ値を持つインスタンスを生成するけど、valueOf()を使おうぜ。
この static メソッドは、よく使われる BigDecimal を再利用できるようにするために、long を引数とするコンストラクタの代わりに提供されます。
この再利用で削減できるメモリなんて微々たるものだろうし、そこが焦点ではないんだけど、Immutableなオブジェクトはきちんとそう扱うべきだと思うんだ。
Immutableとは不変ということ。
Stringだってそうだよね。
String alpha = "abcdefg"; alpha.substring(1); // abcdefg System.out.println(alpha);
substring()を呼び出したとこで、alphaが示すインスタンスの状態が変更されるわけではなく、新しいStringインスタンスが返される。Javaを学び始めたとき、間違えてしまいやすいところ。
実際のコーディングではさすがに何万回同じ値のインスタンスを作るときくらいしか効果はないと思うけど、こうした区別を通じてどういう「概念」なのかということを理解していくことは大切。
管理者はよく勘違いするけど、あるものを「使う・利用する」というのと「理解する」という力量には大きな違いがある。
# Strutsを「使える」というのと「拡張できる」のとの違いみたいなもの。
「使う」だけのプログラマはユースケースでいう「ハッピーシナリオ」の仕事を実装するような作業しかできない。
自戒を込めて。