2012-04-23 92 views
4

將原始值直接分配給包裝類型並使用valueOf API有什麼區別?即將原始值分配給包裝類的正確方法

Long val = 91l; 

Long val = Long.valueOf(91l); 

這個問題是從我一直在打破我的頭數天的錯誤。到目前爲止,我還沒有能夠成功地重新創建它,並且會隨機出現。我有一些對象是作爲處理一些數據的一部分而生成的,這些對象有許多字段,其中一些是Long(Wrapper)類型的。我確信值正被分配給所有變量,但在某些情況下,它們只是即使沒有理由,也會出現NULL。

這個問題相關的方式是,這些Long屬性的Set方法實際上使用long(primitive)類型的參數,並使用第一種方法分配。我不確定這是否會導致它。我已經用第二種方法修改了我的代碼,並且在我開始修復它之前,我正在等待一些好的測試來完成。

我很想知道在我提到的上述2種方法中是否有任何理論上的差異。 (我通常在大多數時間使用第一個。)

回答

8

這兩行將編譯成相同的字節碼(至少在我見過的所有編譯器中)。目前還不清楚你的問題在哪裏,但它不在那裏。 (它不是通過該值是如何創建規範保證,但結果是保證是一個對象,使得longValue()方法將返回原來的原始值。)

例如,反編譯該方法:

static void foo() { 
    Long val1 = 91L; 
    Long val2 = Long.valueOf(91L); 
} 

結束了:

static void foo(); 
    Code: 
    0: ldc2_w #2; //long 91l 
    3: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
    6: astore_0 
    7: ldc2_w #2; //long 91l 
    10: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
    13: astore_1 
    14: return  
} 

(作爲一個小點,我會鼓勵你使用L而非l源代碼作爲後綴 - l可能看起來很像1,具體取決於您的字體。)

相關問題