2009-02-19 31 views
12

Tôi đang đợi câu trả lời 'không' cho câu hỏi này.Bạn có thể lưu trữ biến trong mệnh đề if không?

Tôi đã quan tâm nếu bạn có thể lưu biến cùng một lúc khi bạn kiểm tra biến đó trong mệnh đề if.

Giả sử tôi có mã này.

if(foo!=null){ 
    if(foo.getBar()!=null){ 
    Bar bar = foo.getBar(); 
    System.out.println("Success: " + bar); 
    } else { 
    System.out.println("Failure."); 
    } 
} else { 
    System.out.println("Failure."); 
} 

Tôi xử lý ngay bây giờ để "lỗi" -states độc lập, ngay cả khi kết quả giống nhau. Tôi có thể lấy chúng lại với nhau như thế này:

if(foo!=null && foo.getBar()!=null){ 
    Bar bar = foo.getBar(); 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failure."); 
} 

Đã có nhiều mã khác. nếu foo là null nó sẽ dừng lại ở đó và sẽ không thử foo.getBar (trong if) vì vậy tôi sẽ không nhận được một NPE. Điều cuối cùng tôi muốn nâng cao, và câu hỏi chính: Tôi thực sự đã gọi điện cho foo.getBar() hai lần chưa? Sẽ rất tuyệt khi thoát khỏi cuộc gọi giống hệt thứ hai nếu getBar() sẽ là một hoạt động rất nặng. Vì vậy, tôi tự hỏi nếu có bằng cách nào đó có thể làm điều gì đó tương tự như thế này:

if(foo!=null && (Bar bar = foo.getBar())!=null){ 
    Bar bar = foo.getBar(); 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failure."); 
} 

tôi sẽ phải phá vỡ nó lên đến hai khác nhau nếu là một lần nữa nếu tôi muốn làm

Bar bar = foo.getBar(); 
if (bar!=null) ... 
+0

Nhân tiện, đó là "lỗi". –

Trả lời

25

này là gần nhất bạn có thể nhận được:

Bar bar; 
if(foo!=null && (bar = foo.getBar())!=null){ 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failiure."); 
} 
+0

Vâng, điều này thực sự hiệu quả. Tôi đã cố gắng để có (Bar bar = foo.getBar())! = Null bên trong if, nhưng java dường như không muốn khởi tạo của Object bên trong mệnh đề if. Cảm ơn! –

10

Tôi có sử dụng kỹ thuật mà khi iterating trên dòng từ một BufferedReader:

BufferedReader br = // create reader 
String line 
while ((line = br.readLine()) != null) { 
    // process the line 
} 

Vì vậy, có, bạn có thể làm một bài tập, và kết quả ra khỏi đó sẽ biến phía bên tay trái, sau đó bạn có thể kiểm tra. Tuy nhiên, nó không phải là hợp pháp để khai báo các biến bên trong một bài kiểm tra, vì chúng sẽ chỉ được đưa vào biểu thức đó.

7

nếu bạn muốn giới hạn phạm vi của thanh Bar Tôi muốn thêm {và} xung quanh mã mà Michael đăng.

 
void foo() 
{ 
    // some code ... 

    // this block limits the scope of "Bar bar" so that the rest of the method cannot see 
    // it. 
    { 
     Bar bar; 
     if(foo!=null && (bar = foo.getBar())!=null){ 
      System.out.println("Success: " + bar); 
     } else { 
      System.out.println("Failiure."); 
     } 
    } 
} 

Bạn cũng có thể muốn kiểm tra mẫu đối tượng rỗng nếu có ý nghĩa. Cá nhân tôi cố tránh những thứ không có giá trị nếu tôi có thể ... thực sự nghĩ về nếu bạn muốn không được phép hoặc không được phép.

2

Từ bộ phận "Ngôn ngữ lập trình của tôi tốt hơn ngôn ngữ lập trình của bạn": Trong Groovy, bạn có thể sử dụng "?". điều hành:

Bar bar = foo?.bar 
if (bar != null) { 
} 

Trong Java, đây là mô hình tốt (*):

Bar bar = foo == null ? null : foo.getBar(); 
if (bar != null) { 
} 

*: Một cái gì đó bạn có thể tiết kiệm trong tầm tay của bạn.

1

Ba điểm đó hoàn toàn thất bại trong việc trả lời các câu hỏi:

null là ác. Đừng viết các phương thức trả lại nó. Vấn đề ví dụ của bạn sau đó sẽ biến mất.

Tôi nghĩ bạn có thể bỏ lỡ việc đóng gói. Thay vì foo.getBar() giao diện của foo có được thực hiện sao cho bạn thực hiện thao tác "yêu cầu không hỏi" không?

Tác dụng phụ trong biểu thức có xu hướng gây ra mã xấu. Thích nhiều hơn, các dòng đơn giản hơn, ít hơn, các dòng lỗi. Ngoại lệ thông thường nếu sử dụng ++ để tăng chỉ mục khi truy cập bộ đệm hoặc các thuật toán kiểu vòng lặp tương tự.

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