Javaでオートボックを避けるべきかどうか尋ねたいと思います。メソッドがプリミティブ型 'double'を予期し、 'Double'オブジェクトをパラメータとして渡す場合、コンパイラが渡されたオブジェクトをアンボックスして重くなる可能性があるので、これを避けるべきですか?Javaではオートボクシングを避けるべきです
答えて
これは、Java Notesはautoboxingにこう言われる、
はプリミティブ型を好む
2つの の理由でオブジェクトの必要がないところプリミティブ型を使用します。
- プリミティブ型は、対応するラッパー 型よりもずっと高速であり、決して低速ではありません。
- ラッパーの不変性(作成後に変更することはできません)は、タイプが使用できなくなる可能性があります。
- ==( の参照を比較)と.equals()(値の比較)に関する予期しない動作が発生することがあります。例については、下記の参考文献 を参照してください。
可能な限り、常にプリミティブを使用します。
コレクションのようにこれができない場合がありますので、ラッパーのみを使用してください。
パフォーマンスについて話す場合は、自動ボクシングを避ける必要はありません.JVMはそれを処理する必要があります。考慮する必要があるのは、コードの可読性だけです。
これはデザイン上の選択肢であり、すべてのケースで簡単に答えられるわけではありません。
があなたの決定に影響を与える可能性があり、いくつかの項目があります。
利点:オートボクシングと自動アンボクシングが読みあなたのコードを容易にすることができます
:
はすべてを省くと、
.doubleValue()
とDouble.valueOf()
は、あなたのコードを読みやすくすることができます。オートボクシングは(、...など
List<Double>
など)
短所あなたは簡単にプリミティブ値のコレクションを使用することができます:
過度の、不要なオートボクシング、自動アンボトリングあなたのパフォーマンスを妨げる可能性があります。例えば
、あなたは戻り
double
とはdouble
を見込んで別のAPIがありますが、その間にダブルとして値を扱うが、その後、あなたは無用オートボクシングをやっているというAPIを使用している場合。オートアンボクシングはあなたがそれを期待していない
NullPointerException
を導入することができます:自動箱入り値のコレクションを使用public void frobnicate(Double d) { double result = d/2; // ... }
は、例えば、同等
double[]
よりたくさんより多くのメモリを使用しています。
オートボクシングは避けるべきです。オーバーロードのためにエラーが発生する可能性があり、パフォーマンスに多少の影響があります。 それでも、あなたのアプリケーションでは問題ではないかもしれません。しかし、その影響に注意してください。ここで
と私のポストは:ボックス化解除時に https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/
特定の予期しない動作NullPointerExceptionsが含まれます。 –
autoboxing surprises:http://www.theserverside.com/news/thread.tss?thread_id=27129 –
うん、しかし、質問は「オートボクシング」に関するものだった。彼が「ラッパークラスのプリミティブを使うべきか」と尋ねるなら、あなたは正しいと思います。そうでなければ、autoboxing自体は現代のJVMのパフォーマンスには影響しません。 – Kris