2011-09-30 19 views
9

Javaでオートボックを避けるべきかどうか尋ねたいと思います。メソッドがプリミティブ型 'double'を予期し、 'Double'オブジェクトをパラメータとして渡す場合、コンパイラが渡されたオブジェクトをアンボックスして重くなる可能性があるので、これを避けるべきですか?Javaではオートボクシングを避けるべきです

答えて

7

これは、Java Notesはautoboxingにこう言われる、

はプリミティブ型を好む

2つの の理由でオブジェクトの必要がないところプリミティブ型を使用します。

  1. プリミティブ型は、対応するラッパー 型よりもずっと高速であり、決して低速ではありません。
  2. ラッパーの不変性(作成後に変更することはできません)は、タイプが使用できなくなる可能性があります。
  3. ==( の参照を比較)と.equals()(値の比較)に関する予期しない動作が発生することがあります。例については、下記の参考文献 を参照してください。
+1

特定の予期しない動作NullPointerExceptionsが含まれます。 –

+0

autoboxing surprises:http://www.theserverside.com/news/thread.tss?thread_id=27129 –

+0

うん、しかし、質問は「オートボクシング」に関するものだった。彼が「ラッパークラスのプリミティブを使うべきか」と尋ねるなら、あなたは正しいと思います。そうでなければ、autoboxing自体は現代のJVMのパフォーマンスには影響しません。 – Kris

4

可能な限り、常にプリミティブを使用します。

コレクションのようにこれができない場合がありますので、ラッパーのみを使用してください。

1

パフォーマンスについて話す場合は、自動ボクシングを避ける必要はありません.JVMはそれを処理する必要があります。考慮する必要があるのは、コードの可読性だけです。

4

これはデザイン上の選択肢であり、すべてのケースで簡単に答えられるわけではありません。

あなたの決定に影響を与える可能性があり、いくつかの項目があります。

利点:オートボクシングと自動アンボクシング読みあなたのコードを容易にすることができます

  • すべてを省くと、.doubleValue()Double.valueOf()は、あなたのコードを読みやすくすることができます。

  • オートボクシングは(、...などList<Double>など)

短所あなたは簡単にプリミティブ値のコレクションを使用することができます:

  • 過度の、不要なオートボクシング、自動アンボトリングあなたのパフォーマンスを妨げる可能性があります。例えば

    、あなたは戻りdoubledoubleを見込んで別のAPIがありますが、その間にダブルとして値を扱うが、その後、あなたは無用オートボクシングをやっているというAPIを使用している場合。

  • オートアンボクシングはあなたがそれを期待していないNullPointerExceptionを導入することができます:自動箱入り値のコレクションを使用

    public void frobnicate(Double d) { 
        double result = d/2; 
        // ... 
    } 
    
  • は、例えば、同等double[]よりたくさんより多くのメモリを使用しています。

0

オートボクシングは避けるべきです。オーバーロードのためにエラーが発生する可能性があり、パフォーマンスに多少の影響があります。 それでも、あなたのアプリケーションでは問題ではないかもしれません。しかし、その影響に注意してください。ここで

と私のポストは:ボックス化解除時に https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/