2011-12-13 67 views
5

如何評估以下表達式?Java中的自動裝箱問題

Student類:

public class Student 
{ 
    private Integer id; 
    // few fields here 

    public Integer getId() 
    { 
     return id; 
    } 

    public void setId(Integer id) 
    { 
     this.id=id; 
    } 

    //setters and getters 
} 

而且在一些方法:

{ 
    int studentId; 

    // few lines here 

    if(studentId==student.getId()) // **1. what about auto-unboxing here? Would it compare correctly? I am not sure.** 
    { 
     //some operation here 
    } 
} 
+2

不要使用包裝類,除非你絕對必須。 – mre

+0

是的。你做了什麼會工作。我不確定你問了其他什麼? – Guillaume

+0

+1不使用包裝類:不好的潛在副作用包括不需要的(和隱藏的)NullPointerException拋出您的代碼 – Guillaume

回答

4

是的,這將工作就相當於

studentId==student.getId().intValue() 

只要student.id不null

+4

只是出於好奇,拳擊和拆箱的規則是什麼?我的意思是,爲什麼Java決定** unbox **'Integer'而不是**框**'int'? – bezmax

+1

是否等於student.id是否爲空 –

+0

可能是因爲'int'在左邊? – red1ynx

1

是的,它會正常工作。但通常不建議使用包裝類,直到沒有其他人去。

1

比較

studentId==student.getId() 

將工作,但將拋出一個NullPointerException如果studentnull

作爲一項規則,自動裝箱更喜歡原語,即它會在可能的情況下將Integer轉換爲int而不是其他方式。你的例子顯示了一個很好的理由,因爲引用對象的平等是棘手的。因此,它是可能的:

studentId==student.getId().intValue() 

是真實的,但

new Integer(studentId)==student.getId() 

是假的,因爲雖然它們具有相同的價值,他們是不是同一個對象。

1

是它會工作,因爲這將右操作數轉換爲對應的數字類型,根據Java語言規範:

如果相等運算符的操作數都是數字型的,或一個是數字另一個可以轉換(§5.1.8)爲數字類型,則對操作數執行二進制數字提升(第5.6.2節)。

corresponding paragraph in jls

因此,實際上任何一個操作數可以是數字型的for Java來autounbox另一個。

然後§5.1.8說轉換包括拆箱轉換。corresponing paragraph in jls

1

按照規範,http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

所以,當你應該使用自動裝箱和拆箱?僅當引用類型和基元之間存在「阻抗不匹配」時才使用它們,例如,當您必須將數值放入集合中時。對科學計算或其他性能敏感的數字代碼使用自動裝箱和拆箱並不合適。整數不是int的替代;自動裝箱和取消裝箱模糊了基本類型和引用類型之間的區別,但它們並沒有消除它。

唯一可取的情況下使用包裝類(Integer等),當你想在集合中堅持數值,或null是您用例的可接受值。而已。

副作用包括不需要的潛力NullPointerException和性能下降。