2017-05-29 77 views
0

我最近在一些代碼中工作,當被一個同事審查時,被告知我通過刪除手動裝箱的double值而犯了一個錯誤。我沒有想過,但我只是這樣做,因爲IntelliJ建議我改變它,所以我做了。Java手動裝箱VS自動裝箱的原始數字

我被這位同事指向Effective Java(2nd Edition)的第221頁,其中討論了Boxed原語可以爲null,並且依賴於autounboxing可能導致潛在的空指針異常(除其他外)...但在這種情況下,我正在移除手動裝箱並讓編譯器處理它。

但爲什麼要重要?如果我有一個方法需要Double作爲參數,並且以前傳遞的是new Double(5.0),但是將其更改爲5,那麼可能會產生什麼影響?

+3

它不應該改變任何東西。編譯器將用'Double.valueOf(5)'替換值爲'5'的'Double'參數。一個'Double' *可以爲空,但如果你傳遞一個'double',則不會。 –

+0

是否有理由爲什麼IntelliJ會推薦刪除手動裝箱? – agent154

+0

是否有重載的方法或構造函數可以有不同的行爲? –

回答

5

如果我有需要雙,作爲參數的方法,並且之前通過新的雙(5.0),但將其更改爲5,具有什麼潛在影響?

有沒有壞的影響,因爲這是拳擊,不拆箱。因此,你不會在這裏得到一個NPE,如果你將這個NPE用你傳遞價值的方法拆箱,你也不會。

事實上,通過5作爲Double的參數與傳遞new Double(5.0)不完全相同 - 它實際上是Double.valueOf(5.0)。 Javadoc的優勢在於:

返回一個Double實例,表示指定的double值。如果不需要新的Double實例,通常應該優先使用此方法,而不是構造函數Double(double),因爲此方法通過緩存頻繁請求的值可能會產生顯着更好的空間和時間性能。

因此,通過傳遞Double.valueOf(5.0)可以獲得更好的性能,這是因爲緩存;但您可以使用不太詳細的5代替。


但是,你必須要小心輕微,如果你有重載:一些方法可能有一個比服用Double一個更具體的方法簽名,所以會優先被調用。

4

你給的拳擊例子是完全沒問題的。 問題在於拆箱。您將有NPE,如果你嘗試從空對象封裝得到原始:

Double d = null; 

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

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