一部のコードでは、次のように表示されます。
private void compute(Long a, Long b, Long c) {
long result = a-(b+c);
...
結果がオペランドに対応するLongオブジェクトではなく、プリミティブなlongに格納されるのは少し奇妙に思えます。
結果をプリミティブとして保存する必要がある理由はありますか?
一部のコードでは、次のように表示されます。
private void compute(Long a, Long b, Long c) {
long result = a-(b+c);
...
結果がオペランドに対応するLongオブジェクトではなく、プリミティブなlongに格納されるのは少し奇妙に思えます。
結果をプリミティブとして保存する必要がある理由はありますか?
算術演算子 + および - は、ボックス化された型 (Long など) ではなく、プリミティブ型 (long など) に対して定義されています。
結果もロング。オートボクシングとアンボクシングのチュートリアルを見る
これを Long に自動ボックス化すると、わずかなパフォーマンス コストが発生します。それも不要なので
通常、プリミティブを使用することをお勧めします。特に、プリミティブが null にならないことが確実な場合はそうです。ボックス化された型の使用を主張する場合は、null の場合に何が起こるかを常に考えてください。Java は自動的にボックス化とボックス化解除を行いますが、int をじっと見て、なぜ NullPointerException が発生したのか疑問に思うのは楽しいことです。
Java 1.5 以降では、必要に応じてオートボクシングとアンボクシングが暗黙的に行われます。
次の行:
long result = a-(b+c);
Long
...3 を使用して式の結果を取得し、それをプリミティブな long に格納するように Java に要求します。Java 5 より前は、型が一致しないと文句を言っていましたが、最近では、あなたが言っていることを意味していると仮定して、オブジェクトからプリミティブ型への変換を自動的に行います。
ただし、この例では、ここに記載されていない他の正当な理由がない限り、最初からパラメーターをボックス化されたオブジェクト型として使用しても意味がありません。
に従ってjavadoc
Boxing conversion converts expressions of primitive
type to corresponding expressions of reference type.
Specifically, the following nine conversions are called the boxing conversions:
From type boolean to type Boolean
From type byte to type Byte
From type short to type Short
From type char to type Character
From type int to type Integer
From type long to type Long
From type float to type Float
From type double to type Double
From the null type to the null type
Ideally, boxing a given primitive value p, would always yield an identical reference.
In practice, this may not be feasible using existing implementation techniques. The
rules above are a pragmatic compromise. The final clause above requires that certain
common values always be boxed into indistinguishable objects. The implementation may
cache these, lazily or eagerly. For other values, this formulation disallows any
assumptions about the identity of the boxed values on the programmer's part. This would
allow (but not require) sharing of some or all of these references.
This ensures that in most common cases, the behavior will be the desired one, without
imposing an undue performance penalty, especially on small devices. Less memory-limited
implementations might, for example, cache all char and short values, as well as int and
long values in the range of -32K to +32K.`