2012-12-14 14 views
6

Tôi đang làm việc trên một mã nguồn java mà có phong cách:Ứng dụng có phù hợp với tuyên bố hay không. if (0! = biểu thức hoặc biến) {} trong java?

if (0 == var) {} 
and 
if (null == someObj) {} 

hoặc

if (0 != var) {} 
and 
if (null != someObj) {} 

Tôi có nên viết lại nó để:

if (var == 0) {} 
and 
if (someObj == null) {} 

?

Xin cảm ơn trước !.

+1

Bạn đã gặp mã C được viết bằng Java. Thay đổi nó thành bất cứ điều gì bạn thích. – EJP

+2

Nếu màu xanh là bầu trời ... –

Trả lời

12

Đó là hoàn toàn hợp lệ phải có:

if (0 == var) {} 
and 
if (null == someObj) {} 

Nó nổi tiếng gọi là yoda condition để ngăn chặn sử dụng ngẫu nhiên đơn = ở vị trí của ==.

Cá nhân tôi chưa bao giờ sử dụng nó. Nhưng một số người thích nó. Nó thực sự là một vấn đề của hương vị.


Tuy nhiên, nó không được sử dụng trong Java. Bởi vì, một lỗi đánh máy ngẫu nhiên như vậy được bắt tại thời gian biên dịch.

Sau đây sẽ cung cấp lỗi thời gian biên dịch trong Java.

if(var = 0) 
{ 
//Some code 
} 

Vì thao tác gán không mang lại giá trị Boolean trong Java. Tuy nhiên, trong các ngôn ngữ như C/C++, ở trên là hợp lệ và trình biên dịch sẽ không có lỗi nếu cảnh báo không được kích hoạt. Điều kiện trên if sẽ luôn luôn đánh giá sai (0) trong C/C++. Vì vậy, nó có thể đi không được chú ý và cho kết quả bất ngờ tại thời gian chạy.

Trong GCC, với tất cả các cảnh báo được kích hoạt, nó sẽ cung cấp cho các cảnh báo cho các bên trên trong C hoặc C++:

warning: suggest parentheses around assignment used as truth value 

Vì vậy, đây có thể không sử dụng nhiều trong C/C++ quá là một dự kiến ​​sẽ biên dịch với tất cả cảnh báo và sửa tất cả các cảnh báo. Như tôi đã nói trước đây là sự lựa chọn cá nhân và không tạo ra sự khác biệt nào.

Vì vậy, if (0 == var){} là cú pháp hợp lệ và giống như if (var == 0) {} và nếu bạn thích điều kiện Yoda, hãy thực hiện!

+1

Cũng là một cách hay để ngăn chặn một số trường hợp kiểm tra rỗng. Cảm ơn. – assafmo

0

Kiểu đầu tiên được ưa thích bởi vì giả sử var = null thay vì var == null sẽ là một lỗi khó bắt được bằng các ngôn ngữ như C và C++, nhưng null = var sẽ dễ nắm bắt, vì nó sẽ không biên dịch . Như đã lưu ý trong các chú thích, điều này không áp dụng cho Java vì null = var không phải là một biểu thức logic.

+1

Nó không áp dụng trong java không giống như C hoặc C++ gây ra những điều không thể bị ép buộc để bool của – jozefg

+0

@jozefg Cảm ơn, tôi sẽ cập nhật câu trả lời của tôi. – gsingh2011

+0

Cảm ơn tất cả, điều đó là quá đủ. Tôi đánh giá cao nó. –

4

Nói chung, hãy viết 0 == n được gọi là yoda condition. Bởi vì nếu bạn nói to, bạn nói if zero equals my var.

Tốt hơn là viết n == 0. Nhưng nó là chính xác như nhau. Nhưng nó được đọc tốt hơn.

Một số ưu điểm của điều kiện này không áp dụng cho java.

if (value = 42) 

mang lại lỗi biên dịch. value = 42 mang lại một số int không phải là đầu vào hợp lệ trong một số if trong java. Nhưng hoàn toàn hợp pháp trong C.

Để so sánh sử dụng constant ở phía bên trái là phương pháp hay nhất phổ biến. Nhưng chỉ khi sử dụng Object bằng phương thức.

if ("CONSTANT".equals(myString)) 

nếu myString là null hoặc bạn đang so sánh primitives vì không có quyền truy cập vào .equals() theres biến không có điểm trong kiểm tra null.

if ("CONSTANT" == null) 

Mặc dù chỉ là ý kiến ​​của tôi, lợi ích là tính dễ đọc.

0

Loại cụm từ này được gọi là "Biểu thức Yoda", vì chúng là "ngược" so với ngôn ngữ tự nhiên bằng tiếng Anh.

Tôi không nghĩ rằng nó trả tiền với các bài tập - công cụ kiểm tra mã tốt nắm bắt các loại lỗi này, và hầu hết đã bị trình biên dịch Java nghiêm ngặt hơn (sử dụng = thay vì == là lỗi đánh máy phổ biến trong C!)

Tuy nhiên, khi bạn đang sử dụng phương pháp compareTo, bạn cần xem xét null giá trị.

if ("example".equals(input)) 

không thể chạy vào một NullPointerException, trong khi các chi tiết "tự nhiên"

if (input.equals("example")) 

có thể, và cần thêm kiểm tra cho null giá trị.

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