2017-05-29 13 views
0

私は最近いくつかのコードで働いていた、と同僚が見直したとき、私はダブル値の手動ボクシングを削除して間違いを犯したと言われました。私はそれについて考えなかったが、IntelliJは私がそれを変更することを勧めたので、私はそうした。Javaの手動ボクシング対プリミティブ番号のオートボクシング

Boxedプリミティブがどのようにnullになる可能性があるのか​​、autounboxingに依存すると(他のものの中でも)nullポインタの例外が発生する可能性があることについて、この同僚がEffective Java(2nd Edition)221ページを指摘しました...この場合、私は手作業によるボクシングを取り除いて、コンパイラがそれに対処するようにしていました。

なぜ、それは重要ですか?パラメータとしてDoubleが必要なメソッドがあり、以前はnew Double(5.0)を渡していましたが、代わりに5に変更すると、どのような影響がありますか?

+3

何も変更しないでください。コンパイラは 'Double'パラメータを値 '5'で' Double.valueOf(5) 'に置き換えます。 'Double' *はnullでもかまいませんが、もしあなたが' double'を渡していれば、それはできません。 –

+0

IntelliJが手動ボクシングを削除することを推奨する理由はありますか? – agent154

+0

異なる動作をすることができるオーバーロードされたメソッドまたはコンストラクタがありますか? –

答えて

5

私は、パラメータとしてダブルを、必要とするメソッドを持っている、と以前に新しいダブル(5.0)に渡した場合しかし:あなたはnullオブジェクトラッパーから原始取得しようとする場合は、NPEを持っています代わりに5に変更してください。潜在的な影響は何ですか?これはボクシング、ないアンボクシングあるので

は、何も悪い意味合いはありません。このように、あなたはここでNPEを得ることはできません。また、値を渡す方法でそれを箱から取り除いても、あなたはしません。

実際、5Doubleパラメータとして渡すことは、new Double(5.0)と全く同じではありません。実際はDouble.valueOf(5.0)です。その利点はJavadocにあります。

指定されたdouble値を表すDoubleインスタンスを返します。新しいDoubleインスタンスが必要ない場合、頻繁に要求される値をキャッシュすることにより、このメソッドは空間と時間のパフォーマンスが大幅に向上する可能性があるため、Double(double)コンストラクタより優先されます。

キャッシングのため、Double.valueOf(5.0)を渡すことでパフォーマンスが向上します。代わりに、はるかに少ないverbose 5を使用することができます。あなたがオーバーロードを持っている場合


しかし、あなたは、少し注意する必要があります。これらのメソッドのいくつかはDoubleを取って1以上の固有のメソッドシグネチャを持っているかもしれないし、そう優先して呼び出されます。

4

あなたが与えたボクシングの例はまったく問題ありません。 問題はアンボックスです。

Double d = null; 

double d1 = d; // here you will get NPE 
+0

https://www.youtube.com/watch?v=aYyVtm26BCQ –

関連する問題