2017-12-07 93 views
9

Tôi đã luôn được sử dụng để kiểm tra null nhưobj == null vs rỗng == obj

if(null==obj) 

Khi tôi biên soạn mã của tôi và nhìn vào tập tin .class sau khi dịch ngược, tôi có thể thấy rằng mã của tôi đã thay đổi để

if(obj==null) 

tôi biết trong java null==objobj==null không quan trọng. Nhưng tôi tò mò muốn biết tại sao trình biên dịch lại thay đổi nó?

+0

ok Tôi nên nói "khi tôi biên dịch tập tin lớp bằng trình giải mã" –

+0

trình biên dịch nào bạn đã sử dụng? –

+5

Làm cách nào để bạn biết đó là trình biên dịch chứ không phải trình biên dịch đã thay đổi nó? – maerics

Trả lời

9

Trình biên dịch không thay đổi bất cứ điều gì. Nó trung thành biên soạn if (null == obj)if (obj == null) thành các bytecode khác nhau, mà các trình dịch ngược lại được chuyển đổi về cùng một mã Java.

So sánh với null ở bên phải, tức là

if (o == null) { 
    ... 
} 

được dịch sang mã byte này với ifnonnull hướng dẫn:

0: aload_0 
1: ifnonnull  ... 

So sánh với null bên trái, tức là

if (null == o) { 
    ... 
} 

được t ranslated đến một bytecode khác nhau với if_acmpne hướng dẫn:

0: aconst_null 
1: aload_0 
2: if_acmpne  ... 

Về lý thuyết, decompiler có đủ thông tin để tìm ra cách các đối số được sắp xếp trong file nguồn. Tuy nhiên, họ sản xuất cùng một mã cho cả hai lệnh.

+1

Trên javac của tôi (Oracle 1.7.0_67), đó không phải là trường hợp. Các ops được biên dịch thành 'aconst_null',' aload_1', 'if_acmpne' (cái cuối cùng là" nếu không bằng nhau "). Ditto với 1.8.0_45. Tôi đã không thử với Java 9. – yshavit

+0

@yshavit Bạn nói đúng, trình biên dịch tạo ra hai bộ mã byte khác nhau, vì vậy nó là trình giải mã người trộn lẫn mọi thứ. Cảm ơn bạn! – dasblinkenlight

0

Cả hai đều giống nhau trong Java, vì chỉ các biểu thức boolean mới có thể nằm trong if. Đây chỉ là một lựa chọn phong cách mã hóa bởi lập trình viên và thỏa thuận nhóm làm thế nào để viết.

null != a là một phương pháp cũ trong các ngôn ngữ lập trình như Java, C++ (được gọi là Điều kiện Yoda).

Vì nó hợp lệ để viết nếu (a = null) và vô tình gán giá trị null vào giá trị rỗng đầu tiên là bảo vệ để ngăn chặn tai nạn này xảy ra.

Hầu hết các lập trình viên đều sử dụng a == null chỉ vì nó trông đơn giản hơn để con người hiểu. Có lẽ đây có thể là lý do tại sao trình biên dịch/giải mã đưa chúng theo thứ tự như vậy, có thể có một lý do khác ...

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