オートボクシング:したがって、次のように書くことができます。整数 i = 0;の代わりに:整数 i = 新しい整数(0);
-
12-09-2019 - |
質問
オートボクシングは結局のところ、次のように書けることに尽きるようです。
Integer i = 0;
の代わりに:
Integer i = new Integer(0);
したがって、コンパイラはプリミティブをオブジェクトに自動的に変換できます。
そういう考えですか?何でこれが大切ですか?
解決
ちょっと単純化しすぎましたね。
オートボクシングは、コレクションを使用するときにも機能します。Sun の Java ドキュメントで説明されているように:
コレクションはオブジェクト参照のみを保持できるため、プリミティブ値を適切なラッパー クラスにボックス化する必要があります。 ... コレクションからオブジェクトを取り出すと、入力した整数が取得されます。int が必要な場合は、intValue メソッドを使用して Integer をボックス化解除する必要があります。このボックス化とボックス化解除はすべて面倒であり、コードが乱雑になります。自動ボックス化およびボックス化解除機能によりプロセスが自動化され、煩わしさや煩雑さが解消されます。
では、自動ボックス化とボックス化解除をいつ使用する必要があるでしょうか?これらは、参照型とプリミティブの間に「インピーダンスの不一致」がある場合、たとえば、コレクションに数値を入力する必要がある場合にのみ使用してください。科学計算やその他のパフォーマンス重視の数値コードにオートボックス化とアンボックス化を使用することは適切ではありません。Integer は int の代わりにはなりません。オートボックス化とアンボックス化により、プリミティブ型と参照型の区別があいまいになりますが、それがなくなるわけではありません。
他のヒント
ところで
Integer i = 0;
タグに相当します
Integer i = Integer.valueOf(0);
の区別はのvalueOf()は-128と127の間の値のための新しいオブジェクト(どうやらこれは、Java 6u14場合に調整可能であろう)を作成しないことである
これは、存在しています
List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);
int sum = 0;
for (int i : is) // auto-unboxing
{
sum += i;
}
は、単一の整数の場合、あなたは、デフォルトでは、int型ではなく整数を使用する必要があります。整数はほとんどのコレクションに使用するためのものです。
ロング整数(等号を(使用))と同じ値と異なっているが、限り、それは(==を使用して)整数に等しいことに注意してください。
これは、はい、アイデアです。これは、しかし、int型に整数を割り当てることができるようにさらに便利です。
一つは、オートボクシングが症状ではなく、原因を解決すると主張できます。混乱の本当の源は、Javaの型システムに一貫性がないということです:プリミティブとオブジェクト参照の両方の必要性は、人工と厄介です。オートボクシングは、多少緩和されます。
で私のシニカル帽子:スペック(私はここでオークを意味する)元のJava上の制約のためにアップをするために。だけでなく、初めてます。
は、より読みやすく、すっきりコードになります。 (Javaは演算子のオーバーロードを持っていないので)あなたは作業をやっている場合は特に。
私はジョシュアブロッホの効果的なJavaのを読んだから覚えているから、あなたはそれらの箱入りの対応以上のプリミティブを検討すべきです。その副作用を考慮せずにオートボクシングすると、問題を生成することができます。
林さんのコメントに加えて、プリミティブはスタック上に保存され、プリミティブ・ラッパーは、オブジェクトとして、このによる微妙な意味合いがありますが...ヒープに格納されています。
主な利点は、基本的には、読みやすさ、シンタックスシュガーだろう。 Javaは、Sunは、構文を短くするためにあらゆる方法を試みている、すでに非常に冗長です。