2011-12-13 30 views
5

Biểu thức sau được đánh giá như thế nào?Tự động trong Java

Sinh viên lớp:

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 
} 

Và trong một số phương pháp:

{ 
    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

Không sử dụng các lớp bao bọc trừ khi bạn hoàn toàn phải làm. – mre

+0

Có. những gì bạn đã làm sẽ làm việc. Tôi không chắc bạn có hỏi gì khác không? – Guillaume

+0

+1 không sử dụng các lớp bao bọc: hiệu ứng phụ tiềm ẩn xấu bao gồm NullPointerException không mong muốn (và ẩn) được ném bởi mã của bạn – Guillaume

Trả lời

4

Vâng, điều này sẽ làm việc nó tương đương với

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

student.id miễn là không null .

+4

Chỉ cần tò mò, các quy tắc của boxing và unboxing là gì? Tôi có nghĩa là, tại sao Java quyết định ** unbox ** hộp 'Integer' chứ không phải ** ** ** int'? – bezmax

+1

nó tương đương với dù student.id là null hay không –

+0

Có thể vì 'int' ở bên trái? – red1ynx

1

Có, nó sẽ hoạt động tốt. Nhưng nó thường không được khuyến khích để sử dụng lớp wrapper cho đến khi không có khác đi.

3

Có điều này sẽ hiệu quả, nhưng lưu ý!

Nếu giá trị id Integer trong Student là null, bạn sẽ có một NullPointerException khi đánh giá

studentId == student.getId(); 

Cũng lưu ý autoboxing rằng sẽ có một số chi phí hoạt động, vì vậy bạn chỉ nên sử dụng nó nếu bạn phải.

đọc thêm ở đây: http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

1

Việc so sánh

studentId==student.getId() 

sẽ làm việc, nhưng sẽ ném một NullPointerException nếu studentnull.

Khi quy tắc tự động ưu tiên nguyên thủy, tức là hộp này sẽ chuyển đổi một số Integer thành int nếu có thể thay vì theo cách khác. Ví dụ của bạn cho thấy một lý do chính đáng cho điều này, vì sự bình đẳng cho các đối tượng tham chiếu là khó khăn. Vì vậy, nó có thể cho:

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

đến mức khó tin nhưng

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

là sai, vì trong khi họ có cùng giá trị chúng không phải là cùng một đối tượng.

1

Có nó sẽ làm việc, vì nó sẽ chuyển đổi toán hạng bên phải để tương ứng với loại số, theo java ngôn ngữ đặc tả:

Nếu toán hạng của một nhà điều hành bình đẳng đều là kiểu số, hoặc là một trong số loại và loại kia có thể chuyển đổi (§5.1.8) thành kiểu số, khuyến mãi số nhị phân được thực hiện trên các toán hạng (§5.6.2).

corresponding paragraph in jls

Vì vậy, trên thực tế bất kỳ của các toán hạng có thể là kiểu số cho java để autounbox một trong những khác.

Và sau đó §5.1.8 cho biết rằng chuyển đổi bao gồm chuyển đổi unboxing.corresponing paragraph in jls

1

Theo thông số kỹ thuật, http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

Vì vậy, khi bạn nên sử dụng autoboxing và unboxing? Chỉ sử dụng chúng khi có “sự không phù hợp trở kháng” giữa các kiểu tham chiếu và các kiểu nguyên thủy, ví dụ, khi bạn phải đặt các giá trị số vào một bộ sưu tập. Nó không thích hợp để sử dụng autoboxing và unboxing cho máy tính khoa học, hoặc mã số hiệu suất nhạy cảm khác. Một số nguyên không phải là một thay thế cho một int; autoboxing và unboxing làm mờ sự khác biệt giữa các kiểu nguyên thủy và các kiểu tham chiếu, nhưng chúng không loại bỏ nó.

Những trường hợp nên chỉ sử dụng các lớp wrapper (Integer, vv) là khi bạn muốn dính vào giá trị số trong một bộ sưu tập, hoặc null là một giá trị có thể chấp nhận đối với trường hợp sử dụng của bạn. Đó là nó.

Tác dụng phụ bao gồm tiềm năng không mong muốn NullPointerException và giảm hiệu suất.

Các vấn đề liên quan