これはFlyweight パターンと呼ばれ、メモリ使用量を最小限に抑えるために使用されます。
これらの数値は繰り返し使用される可能性が非常に高く、 のような autobox 型Integer
は不変です (これは だけではありませんInteger
)。それらをキャッシュすると、多くのインスタンスがなくなり、GC (ガベージ コレクション) の作業も削減されます。
JLS は5.1.7 でこれをカバーしています。 具体的には、次のように言ってボクシング コンバージョンを行います。
ボックス化された値 p が true、false、\u0000 ~ \u007f の範囲のバイト、または char、または -128 ~ 127 (両端を含む) の int または short の数値である場合、r1 および r2 を次の結果とします。 p の任意の 2 つのボクシング変換。r1 == r2 は常にそうです。
理想的には、指定されたプリミティブ値 p をボックス化すると、常に同一の参照が生成されます。実際には、これは既存の実装技術を使用して実現できない場合があります。上記のルールは実用的な妥協案です。上記の最後の節では、特定の共通値を常に区別できないオブジェクトにボックス化する必要があります。実装は、遅延または積極的にこれらをキャッシュする場合があります。他の値については、この定式化により、プログラマー側でボックス化された値の同一性に関する仮定ができなくなります。これにより、これらの参照の一部またはすべてを共有できます (必要ではありません)。
これにより、ほとんどの一般的なケースで、特に小さなデバイスで過度のパフォーマンスのペナルティを課すことなく、動作が望ましいものになることが保証されます。メモリ制限の少ない実装では、たとえば、すべての char 値と short 値、および -32K から +32K の範囲の int 値と long 値をキャッシュする場合があります。