Câu lệnh IF - ELSE ngắn gọn


82

Tôi đang cố gắng làm cho mã của mình dễ đọc hơn, vì vậy tôi quyết định sử dụng một số câu lệnh IF ngắn.

Đây là mã của tôi không hoạt động ("không phải là một câu lệnh"):

jXPanel6.isVisible() ? jXPanel6.setVisible(true) : jXPanel6.setVisible(false);

Có gì sai với điều này? Cần dấu ngoặc? Ở đâu?


2
Mặc dù mautetto đã cung cấp cách viết tốt hơn, cấu trúc này thường được gọi là toán tử bậc ba. (Trong trường hợp bạn đang tự hỏi;))
Reese Moore

Đó là toán tử điều kiện . "Ternary" chỉ có nghĩa là nó có 3 toán hạng.

Liên kết đến đặc tả ngôn ngữ cho toán tử có điều kiện: docs.oracle.com/javase/specs/jls/se10/html/…

Câu trả lời:


214

"Biểu thức bậc ba" x ? y : zchỉ có thể được sử dụng để gán có điều kiện . Đó là, bạn có thể làm điều gì đó như:

String mood = inProfit() ? "happy" : "sad";

bởi vì biểu thức bậc ba đang trả về một cái gì đó (loại Stringtrong ví dụ này).

Nó không thực sự được sử dụng như một đoạn ngắn, nội dòng if-else. Đặc biệt, bạn không thể sử dụng nó nếu các phần riêng lẻ không trả về giá trị hoặc trả về giá trị của các kiểu không tương thích. (Vì vậy, trong khi bạn có thể làm điều này nếu cả hai phương thức đều trả về cùng một giá trị, bạn không nên gọi nó chỉ cho các mục đích tác dụng phụ).

Vì vậy, cách thích hợp để làm điều này sẽ chỉ là với một khối if-else:

if (jXPanel6.isVisible()) {
    jXPanel6.setVisible(true);
}
else {
    jXPanel6.setVisible(false);
}

tất nhiên có thể được rút ngắn thành

jXPanel6.setVisible(jXPanel6.isVisible());

Đối với tôi, cả hai biểu thức sau đều dễ đọc hơn ở chỗ chúng truyền đạt rõ ràng hơn những gì bạn đang cố gắng làm. (Và nhân tiện, bạn đã hiểu sai điều kiện của mình chưa? Có vẻ như đây là một lựa chọn không sử dụng, thay vì bật tắt).

Đừng trộn lẫn số lượng ký tự thấp với khả năng đọc . Điểm mấu chốt là những gì dễ hiểu nhất; và việc lạm dụng nhẹ các đặc điểm ngôn ngữ là một cách rõ ràng để gây nhầm lẫn cho người đọc, hoặc ít nhất là khiến họ phải suy nghĩ kỹ.


1
Đơn giản là không đúng khi bạn chỉ có thể sử dụng toán tử điều kiện để gán. Bạn có thể sử dụng nó ở bất kỳ đâu cần có biểu thức.

28
jXPanel6.setVisible(jXPanel6.isVisible());

hoặc ở dạng của bạn:

jXPanel6.setVisible(jXPanel6.isVisible()?true:false);

14
FWIW, tôi cảm thấy rằng không bao giờ cần phải viết <bool condition> ? true : falsevì nó chính xác tương đương với chỉ <bool condition>.
Andrzej Doyle

2
Chắc chắn! Nhưng monczek hỏi về câu lệnh If-Else ngắn nên tôi đã viết mã nó chỉ để hiển thị cú pháp.
mauretto

4

Toán tử bậc ba chỉ có thể là bên phải của một phép gán chứ không phải là một câu lệnh của chính nó.

http://www.devdaily.com/java/edu/pj/pj010018/


Không đúng khi toán tử điều kiện chỉ có thể được sử dụng trên RHS của một phép gán. Nó có thể được sử dụng ở bất cứ đâu mà một biểu thức có thể được sử dụng.


2

Tôi đến bữa tiệc hơi muộn nhưng dành cho những độc giả tương lai.

Từ những gì tôi có thể nói, bạn chỉ muốn chuyển đổi trạng thái hiển thị đúng không? Tại sao không chỉ sử dụng !toán tử?

jxPanel6.setVisible(!jxPanel6.isVisible);

Nó không phải là câu lệnh if nhưng tôi thích phương pháp này hơn cho mã liên quan đến ví dụ của bạn.


Ngoài ra, nếu bạn đang cố gắng chuyển đổi trạng thái, tôi nghĩ rằng câu lệnh đó là ngược. Đây có phải là lý do tại sao nó không hoạt động? Nó có nên là jXPanel6.isVbroken () không? jXPanel6.setVosystem (false): jXPanel6.setVosystem (true);
Andy Body

Nếu đó không phải là một câu lệnh chuyển đổi thì tôi không hiểu mục đích của việc hiển thị thứ gì đó đã được đặt theo cách đó. IsVible truy xuất trạng thái và setVible đặt trạng thái, phải không? Nếu câu lệnh isVible trả về true, tại sao lại đặt nó thành true. Tui bỏ lỡ điều gì vậy?
Andy Body

1

Bạn có thể làm điều đó đơn giản như sau, tôi đã làm điều đó trong các móc phản ứng:

 (myNumber == 12) ? "true" : "false"

nó bằng với hàm if dài này bên dưới:

if (myNumber == 12) {
  "true"
} else {
  "false"
}

Hy vọng nó sẽ giúp ^ _ ^

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.