- 1 1. “OR” là gì trong Java?
- 2 2. Các nguyên tắc cơ bản của toán tử OR logic || (Phổ biến nhất trong câu lệnh if)
- 3 3. Quan Trọng: || Sử Dụng Đánh Giá Ngắn Mạch
- 4 4. Sự Khác Biệt Giữa || và | (Điểm Gây Nhầm Lẫn Phổ Biến Nhất)
- 4.1 4.1 Hiểu Kết Luận Đầu Tiên: Chúng Có Các Trường Hợp Sử Dụng Khác Nhau
- 4.2 4.2 Sự Khác Biệt Khi Dùng Với Boolean
- 4.3 4.3 Sự Khác Biệt Chủ Chốt: Ngắn Mạch vs Không Ngắn Mạch
- 4.4 4.4 Tại Sao Việc Dùng | Trong Điều Kiện Là Nguy Hiểm
- 4.5 4.5 Nơi | Thực Sự Được Dùng (OR Bitwise)
- 4.6 4.6 Quy Tắc Đơn Giản Cho Người Mới
- 5 5. Kết Hợp Nhiều Điều Kiện OR (Dấu Ngoặc và Độ Dễ Đọc)
- 5.1 5.1 Mẫu Cơ Bản: Nối Liên Các Điều Kiện OR
- 5.2 5.2 Vấn Đề Khi Số Điều Kiện Tăng
- 5.3 5.3 Cải thiện khả năng đọc bằng cách trích xuất các biến boolean
- 5.4 5.4 Kết hợp AND (&&) và OR (||): Sử dụng dấu ngoặc
- 5.5 5.5 Khi các điều kiện trở nên phức tạp, hãy trích xuất thành một phương thức
- 5.6 5.6 Tóm tắt phần
- 6 6. Độ ưu tiên toán tử (Nguồn gốc lỗi phổ biến)
- 7 7. Những Cạm Bẫy Thường Gặp (Lỗi Phổ Biến và Cách Tránh)
- 8 8. Ví Dụ Thực Tế Cho Việc Sử Dụng (Sao Chép & Thử)
- 9 9. Tóm Tắt (Với Bảng Tham Khảo Nhanh)
- 10 10. CÂU HỎI THƯỜNG GẶP (FAQ)
1. “OR” là gì trong Java?
Trong Java, OR chủ yếu được sử dụng trong các nhánh điều kiện (như câu lệnh if) để đưa ra quyết định như “OK nếu bất kỳ một trong hai đều đúng.”
Nó cũng là một điểm khó thường gặp đối với người mới bắt đầu, vì vậy việc hiểu đúng cách nó khác với AND và ý nghĩa của các ký hiệu là rất quan trọng.
1.1 Các tình huống thường gặp cần điều kiện OR
Các điều kiện OR xuất hiện rất thường xuyên trong cả phát triển thực tế và quá trình học. Ví dụ:
Khi bạn muốn thực thi logic nếu bất kỳ một điều kiện nào được đáp ứng wp:list /wp:list
- Nếu là ngày lễ hoặc cuối tuần, bạn muốn phân nhánh quy trình
Khi bạn muốn kiểm tra nhiều điều kiện đầu vào cùng một lúc wp:list /wp:list
Nếu giá trị là
nullhoặc một chuỗi rỗng, bạn muốn coi đó là lỗiKhi bạn muốn cho phép một hành động cho nhiều vai trò hoặc trạng thái wp:list /wp:list
Cho phép thực hiện nếu người dùng là admin hoặc là chủ sở hữu
Trong ngôn ngữ hàng ngày, nó giống như nói:
“A hoặc B là OK.”
Nó thực chất là chuyển quyết định đó trực tiếp thành mã.
1.2 Cách cơ bản để viết OR trong Java
Trong Java, OR logic được viết bằng toán tử || (hai dấu gạch đứng).
if (conditionA || conditionB) {
// Runs when either conditionA or conditionB is true
}
Mã này có nghĩa là:
conditionAlàtruehoặcconditionBlàtrue
Nếu bất kỳ một trong hai là true, đoạn mã bên trong khối if sẽ được thực thi.
1.3 “OR” là kiểu quyết định phù hợp với ngôn ngữ tự nhiên
Vì các điều kiện OR gần gũi với cách chúng ta suy luận trong ngôn ngữ tự nhiên, một cách tắt gọn ban đầu là “dịch nó thành một câu.”
if (isHoliday || isWeekend) {
System.out.println("今日は休みです");
}
Trong tiếng Anh, điều này có nghĩa là:
“Nếu là ngày lễ hoặc cuối tuần, in ‘Hôm nay là ngày nghỉ.’”
Là người mới bắt đầu, thay vì:
- ghi nhớ các ký hiệu như chúng
- cố gắng áp dụng chúng một cách máy móc như ngữ pháp
thường nhanh hơn (và giảm lỗi) khi đầu tiên diễn lại bằng lời.
1.4 Những gì bài viết này sẽ giải thích tiếp theo
Rất nhiều người tìm kiếm “java or” đều bối rối không chỉ về ý nghĩa của OR, mà còn về:
- Sự khác nhau giữa
||và|là gì? - Tại sao “phần bên phải không chạy” đôi khi xảy ra?
- Cần lưu ý gì khi sử dụng nó cùng với AND (
&&)? - Làm sao viết nó một cách an toàn trong mã thực tế?
Trong bài viết này, chúng tôi sẽ trả lời các câu hỏi này theo thứ tự sau:
- Cơ bản → Cơ chế → Cạm bẫy → Ứng dụng thực tế
với các giải thích rõ ràng, thân thiện với người mới bắt đầu.
2. Các nguyên tắc cơ bản của toán tử OR logic || (Phổ biến nhất trong câu lệnh if)
Khi viết các điều kiện OR trong Java, toán tử cơ bản và được sử dụng nhiều nhất là toán tử OR logic ||.
Nếu bạn đã tìm kiếm “java or,” có thể nói rằng || là điều đầu tiên bạn cần hiểu.
2.1 Ý nghĩa và vai trò của ||
Toán tử OR logic || đánh giá thành true nếu bất kỳ điều kiện trái hoặc phải nào là true.
ConditionA || ConditionB
Biểu thức này được đánh giá như sau:
| ConditionA | ConditionB | Result |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
Nói cách khác:
Nó sai chỉ khi cả hai đều sai
Nếu không thì nó đúng
Đó là một quy tắc rất đơn giản.
2.2 Cách sử dụng cơ bản trong câu lệnh if
Trong mã thực tế, || hầu như luôn được sử dụng trong một điều kiện if.
int age = 20;
if (age >= 18 || age == 17) {
System.out.println("入場可能です");
}
Điều này có nghĩa là:
“Cho phép vào nếu tuổi từ 18 trở lên hoặc tuổi là 17.”
Nếu bất kỳ một điều kiện nào được thỏa mãn, đoạn mã bên trong khối if sẽ chạy.
2.3 || kết nối các biểu thức boolean
Cả hai phía của || phải là các biểu thức đánh giá thành giá trị boolean (true/false).
Ví dụ đúng:
if (score >= 80 || score == 100) {
// OK
}
Ví dụ sai:
if (score || 100) {
// Compile error
}
Bạn không thể OR các số hoặc chuỗi thuần túy trực tiếp.
Thay vào đó, bạn kết hợp OR với:
- các toán tử so sánh (
==,>=,<, v.v.) - biến boolean
- các phương thức trả về boolean
để tạo thành các điều kiện hợp lệ.
2.4 Khi OR Làm Cho Code Dễ Đọc Hơn
Sử dụng || cho phép bạn nhóm nhiều kiểm tra vào một quyết định duy nhất.
if (status.equals("ADMIN") || status.equals("OWNER")) {
System.out.println("操作が許可されています");
}
Điều này rõ ràng thể hiện:
“Cho phép hoạt động nếu người dùng là admin hoặc chủ sở hữu.”
Nếu bạn tránh OR và viết riêng lẻ, nó sẽ trở nên dài dòng:
if (status.equals("ADMIN")) {
System.out.println("操作が許可されています");
} else if (status.equals("OWNER")) {
System.out.println("操作が許可されています");
}
Sử dụng OR mang lại lợi ích như:
- ít code hơn
- ý định rõ ràng ngay từ cái nhìn đầu tiên
- dễ dàng sửa đổi hoặc mở rộng
và vân vân.
2.5 Những Điểm Chính Mà Người Mới Bắt Đầu Nên Học Trước
Ở giai đoạn này, chỉ cần nhớ ba điểm này:
||nghĩa là “OK nếu một trong hai bên là true”- Nó thường được sử dụng trong điều kiện
if - Cả hai bên phải là biểu thức boolean
3. Quan Trọng: || Sử Dụng Đánh Giá Ngắn Mạch
Đặc điểm quan trọng nhất của toán tử OR logic || là
đánh giá ngắn mạch.
Việc bạn hiểu hay không có thể tạo ra sự khác biệt lớn trong
việc bạn viết code an toàn hay giới thiệu lỗi.
3.1 Đánh Giá Ngắn Mạch Là Gì?
Đánh giá ngắn mạch nghĩa là: nếu kết quả đã được xác định bởi bên trái, bên phải sẽ không được đánh giá.
Đối với điều kiện OR, quy tắc là:
- Nếu bên trái là
true→ toàn bộ biểu thức được đảm bảo là true - Do đó, bên phải sẽ không chạy
if (conditionA || conditionB) { // process }
Trong trường hợp này:
- Nếu
conditionAlàtrue→conditionBkhông được đánh giá
3.2 Một Ví Dụ Cụ Thể Về Đánh Giá Ngắn Mạch
Hãy xem code sau:
boolean result = true || expensiveCheck();
Trong trường hợp này:
- Bên trái là
true - Vì là điều kiện OR, kết quả đã được xác định
Vì vậy phương thức expensiveCheck() không được gọi.
Đây không phải là lỗi—đây là hành vi đúng theo đặc tả của Java.
3.3 Tại Sao Đánh Giá Ngắn Mạch Quan Trọng?
Đánh giá ngắn mạch có lợi ích thực tế lớn.
1. Nó Tránh Công Việc Không Cần Thiết
if (isAdmin || checkDatabase()) {
// process
}
- Nếu người dùng là admin, không cần gọi
checkDatabase() - Các hoạt động nặng như truy cập DB có thể được bỏ qua tự động
➡ Hiệu suất tốt hơn
2. Nó Ngăn Chặn Các Ngoại Lệ (Lỗi)
Đánh giá ngắn mạch cũng thường được sử dụng cố ý để tránh lỗi.
if (user == null || user.isGuest()) {
// guest logic
}
Trong code này:
- Nếu
user == nulllàtrue user.isGuest()không được đánh giá
Vì vậy NullPointerException sẽ không xảy ra.
Đây là một mẫu nguy hiểm mà người mới thường viết:
if (user.isGuest() || user == null) {
// Dangerous: may cause NullPointerException
}
➡ Khi dựa vào đánh giá ngắn mạch, luôn đặt kiểm tra null ở bên trái
Đây cơ bản là thực hành phổ biến trong code thực tế.
3.4 Một Bẫy Phổ Biến Với Đánh Giá Ngắn Mạch
Short-circuiting hữu ích, nhưng nếu bạn sử dụng mà không nhận ra, nó cũng có thể gây nhầm lẫn.
Đừng Đặt Các Hoạt Động “Tác Dụng Phụ” Ở Bên Phải
if (flag || count++) {
// some process
}
Trong trường hợp này:
- Nếu
flaglàtrue count++không được thực thi
Điều này có thể dễ dàng dẫn đến lỗi nơi “một quá trình bạn giả định luôn chạy” đôi khi không chạy.
3.5 Tóm Tắt Cho Người Mới (Đánh Giá Ngắn Mạch)
Những điểm chính từ phần này:
||có nghĩa là nếu phía bên trái đúng, phía bên phải sẽ không được đánh giá- Đây không phải là lỗi—đó là hành vi dự định của Java
- Sử dụng nó để tránh lỗi null và bỏ qua công việc tốn kém
- Không đặt các thao tác có tác dụng phụ bên trong điều kiện
4. Sự Khác Biệt Giữa || và | (Điểm Gây Nhầm Lẫn Phổ Biến Nhất)
Một trong những lý do lớn nhất khiến mọi người bối rối khi tìm kiếm “java or” là
|| và | trông giống nhau.
Nhưng kết luận rất đơn giản: hai toán tử này hoàn toàn khác nhau về mục đích và hành vi.
4.1 Hiểu Kết Luận Đầu Tiên: Chúng Có Các Trường Hợp Sử Dụng Khác Nhau
Hãy tóm tắt sự khác biệt trong một dòng:
||: toán tử OR logic (cho các điều kiện nhánh, với đánh giá ngắn mạch)|: toán tử OR bitwise (cho các phép toán bit trên số, không có đánh giá ngắn mạch)
Là người mới, chỉ cần nhớ quy tắc này:
Trong các câu lệnh if, cơ bản chỉ dùng ||.
Bạn sẽ hầu như không bao giờ gặp khó khăn nếu tuân theo.
4.2 Sự Khác Biệt Khi Dùng Với Boolean
Thực tế, | cũng có thể được dùng với boolean.
Đây chính là nguyên nhân gây nhầm lẫn.
boolean a = true;
boolean b = false;
System.out.println(a || b); // true
System.out.println(a | b); // true
Nếu bạn chỉ nhìn vào kết quả, cả hai đều trở thành true.
Tuy nhiên, hành vi đánh giá hoàn toàn khác nhau.
4.3 Sự Khác Biệt Chủ Chốt: Ngắn Mạch vs Không Ngắn Mạch
|| (với đánh giá ngắn mạch)
if (a || check()) {
// process
}
alà true- Kết quả đã được xác định
check()không được thực thi
| (không có đánh giá ngắn mạch)
if (a | check()) {
// process
}
- Ngay cả khi
alà true check()luôn luôn được thực thi
Đây là sự khác biệt quyết định.
4.4 Tại Sao Việc Dùng | Trong Điều Kiện Là Nguy Hiểm
Đây là một lỗi thường gặp của người mới:
if (user != null | user.isActive()) {
// dangerous
}
Với đoạn mã này:
- Ngay cả khi
user != nulllà false user.isActive()vẫn được thực thi
Kết quả là một NullPointerException xảy ra.
Phiên bản đúng là:
if (user != null || user.isActive()) {
// safe
}
➡ Không sử dụng | cho nhánh điều kiện
Vui lòng ghi nhớ điều này một cách chắc chắn.
4.5 Nơi | Thực Sự Được Dùng (OR Bitwise)
| là một toán tử bitwise dùng để thao tác bit.
int READ = 1; // 0001
int WRITE = 2; // 0010
int permission = READ | WRITE; // 0011
Điều này được dùng trong các trường hợp như:
- kết hợp các flag
- quản lý cài đặt bằng các bit
và các mẫu tương tự.
4.6 Quy Tắc Đơn Giản Cho Người Mới
Khi còn nghi ngờ, hãy dùng các quy tắc sau:
- câu lệnh
if/ điều kiện →|| - phép toán bit trên số →
| - Hầu như không cần dùng
|với boolean - Nếu muốn ngắn mạch, luôn dùng
||
Trong phần tiếp theo, chúng tôi sẽ giải thích
cách kết hợp nhiều điều kiện OR và giữ cho mã của bạn dễ đọc.
5. Kết Hợp Nhiều Điều Kiện OR (Dấu Ngoặc và Độ Dễ Đọc)
Trong các chương trình thực tế, các điều kiện OR hiếm khi chỉ dừng lại ở hai kiểm tra.
Thường xuyên hơn, bạn cần kết hợp ba hoặc nhiều hơn các điều kiện.
Phần này giải thích cú pháp đúng và cách giữ mã của bạn dễ đọc khi số lượng điều kiện tăng.
5.1 Mẫu Cơ Bản: Nối Liên Các Điều Kiện OR
Bạn có thể nối các điều kiện OR bằng cách lặp lại ||.
if (status.equals("ADMIN") || status.equals("OWNER") || status.equals("EDITOR")) {
// permission granted
}
Điều này thực sự có nghĩa là:
“Nếu trạng thái là ADMIN hoặc OWNER hoặc EDITOR, quyền được cấp.”
Khi số lượng điều kiện ít, cách này hoàn toàn ổn.
5.2 Vấn Đề Khi Số Điều Kiện Tăng
Khi các điều kiện OR tăng lên, các vấn đề sau thường xuất hiện:
- Các dòng trở nên dài và khó đọc
- Ý định của điều kiện trở nên không rõ ràng
- Sai sót dễ xảy ra hơn trong quá trình bảo trì
if (a || b || c || d || e) { // unclear intent }
Trong những trường hợp này, bạn nên cải thiện cấu trúc thay vì tiếp tục mở rộng điều kiện.
5.3 Cải thiện khả năng đọc bằng cách trích xuất các biến boolean
Kỹ thuật đơn giản và hiệu quả nhất là trích xuất các biến boolean có ý nghĩa.
boolean isAdmin = status.equals("ADMIN");
boolean isOwner = status.equals("OWNER");
boolean isEditor = status.equals("EDITOR");
if (isAdmin || isOwner || isEditor) {
// permission granted
}
Điều này ngay lập tức mang lại những lợi ích lớn:
- Ý định của mã rõ ràng ngay từ cái nhìn đầu tiên
- Các điều kiện dễ dàng thêm hoặc loại bỏ
- Lỗi xảy ra ít hơn

5.4 Kết hợp AND (&&) và OR (||): Sử dụng dấu ngoặc
Khi kết hợp các điều kiện OR và AND, luôn luôn sử dụng dấu ngoặc.
// Recommended
if (isLogin && (isAdmin || isOwner)) {
// process
}
Nếu không có dấu ngoặc, thứ tự đánh giá có thể không khớp với ý định của bạn.
// Not recommended (confusing)
if (isLogin && isAdmin || isOwner) {
// hard to understand
}
Bất kỳ điều kiện nào không ngay lập tức rõ ràng cho người đọc sẽ trở thành nợ kỹ thuật cho bản thân bạn trong tương lai.
5.5 Khi các điều kiện trở nên phức tạp, hãy trích xuất thành một phương thức
Nếu các điều kiện ngày càng phức tạp hơn, cách tiếp cận an toàn nhất là trích xuất chúng thành một phương thức.
if (isAllowedUser(user)) {
// process
}
boolean isAllowedUser(User user) {
return user != null && (user.isAdmin() || user.isOwner());
}
Điều này mang lại một số lợi thế:
- Câu lệnh
ifvẫn sạch sẽ - Logic trở nên dễ kiểm thử hơn
- Logic có thể được tái sử dụng
5.6 Tóm tắt phần
Khi sử dụng nhiều điều kiện OR, hãy nhớ các quy tắc sau:
- Phân tách các điều kiện khi chúng phát triển
- Luôn sử dụng dấu ngoặc khi kết hợp AND và OR
- Trích xuất các phương thức khi logic trở nên phức tạp
6. Độ ưu tiên toán tử (Nguồn gốc lỗi phổ biến)
Trong Java, mỗi toán tử có một độ ưu tiên (thứ tự đánh giá) được định nghĩa.
Nếu bạn không hiểu điều này khi sử dụng các điều kiện OR,
bạn có thể gây ra lỗi khiến mã không hoạt động như mong đợi.
6.1 Độ ưu tiên của && và ||
Trong các toán tử logic, thứ tự ưu tiên là:
&&(AND)||(OR)
Điều này có nghĩa là AND được đánh giá trước OR.
boolean result = false || true && false;
Biểu thức này được đánh giá theo thứ tự sau:
true && false→ falsefalse || false→ false
Kết quả cuối cùng là false.
6.2 Thứ tự đánh giá với dấu ngoặc
Khi bạn thêm dấu ngoặc, biểu thức trong ngoặc sẽ được đánh giá đầu tiên.
boolean result = (false || true) && false;
Thứ tự đánh giá trở thành:
false || true→ truetrue && false→ false
Kết quả vẫn là false, nhưng luồng đánh giá hoàn toàn khác.
6.3 Hiểu lầm phổ biến trong câu lệnh if
Xem xét câu lệnh if sau:
if (isLogin && isAdmin || isOwner) {
// process
}
Theo quy tắc độ ưu tiên của Java, câu này được hiểu là:
if ((isLogin && isAdmin) || isOwner) {
// process
}
Kết quả là:
- Người dùng có thể chưa đăng nhập
- Nếu
isOwnerlà true, quá trình vẫn chạy
Điều này có thể dẫn đến hành vi không mong muốn.
6.4 Cách an toàn để làm rõ ý định của bạn
Nếu ý định của bạn là:
“Người dùng đã đăng nhập, và (là admin hoặc là owner)”
thì luôn sử dụng dấu ngoặc:
if (isLogin && (isAdmin || isOwner)) {
// correct
}
Cách viết này:
- Dễ dàng cho người đọc hiểu
- Không cần ghi nhớ các quy tắc độ ưu tiên
- An toàn hơn cho việc bảo trì trong tương lai
6.5 Bạn không cần ghi nhớ các quy tắc độ ưu tiên
Các lỗi thường gặp của người mới bắt đầu bao gồm:
- Cố gắng ghi nhớ tất cả các quy tắc độ ưu tiên của toán tử
- Quen viết các điều kiện mà không có dấu ngoặc
Trong phát triển thực tế, chỉ cần tuân theo quy tắc này:
“Khi còn nghi ngờ, luôn luôn sử dụng dấu ngoặc.”
Chỉ cần như vậy là đủ.
6.6 Tóm tắt Phần
Các điểm chính trong phần này:
&&có độ ưu tiên cao hơn||- Dấu ngoặc đơn ghi đè độ ưu tiên
- Các điều kiện không rõ ràng là nguy hiểm
- Sử dụng dấu ngoặc để tăng tính đọc được và an toàn
7. Những Cạm Bẫy Thường Gặp (Lỗi Phổ Biến và Cách Tránh)
Tới thời điểm này, bạn đã hiểu các nguyên tắc cơ bản và cách hoạt động của toán tử OR.
Phần này giới thiệu các lỗi thường gặp mà người mới bắt đầu thường gặp và cách tránh an toàn.
Hầu hết các trường hợp này là những tình huống mà bạn sẽ nghĩ: “Nếu tôi biết trước điều này, tôi đã tránh được.”
Hãy chắc chắn xem lại chúng ít nhất một lần.
7.1 Lỗi Do Thứ Tự Kiểm Tra null Sai
Sai lầm phổ biến nhất là kiểm tra null theo thứ tự sai.
Ví dụ Nguy Hiểm
if (user.isActive() || user == null) {
// process
}
Trong đoạn mã này:
- Nếu
userlànull user.isActive()sẽ được đánh giá trước
Kết quả là một NullPointerException xảy ra.
Ví dụ Đúng (Sử Dụng Đánh Giá Ngắn Mạch)
if (user == null || user.isActive()) {
// safe
}
- Kiểm tra
nullnằm ở phía trái - Nếu đúng, phía bên phải sẽ không được đánh giá
➡ Khi dựa vào đánh giá ngắn mạch, luôn đặt các điều kiện an toàn ở phía trái
Nguyên tắc này cực kỳ quan trọng không chỉ với các điều kiện OR, mà còn với các điều kiện AND.
7.2 Sử Dụng | Nhầm (Đánh Giá Ngắn Mạch Không Áp Dụng)
Vì chúng trông giống nhau, nên dễ dàng vô tình dùng | thay vì ||.
if (user != null | user.isActive()) {
// source of bugs
}
Trong trường hợp này:
- Ngay cả khi
user != nulllà sai user.isActive()luôn được thực thi
➡ Nếu user là null, lỗi sẽ xảy ra ngay lập tức.
Luôn luôn dùng || trong các nhánh điều kiện.
Biến điều này thành thói quen nghiêm ngặt.
7.3 Viết Các Phép Tác Động Bên Trong Điều Kiện
Cũng nguy hiểm khi viết các phép thay đổi trạng thái bên trong điều kiện.
if (isValid || count++) {
// some process
}
- Nếu
isValidlà true count++sẽ không được thực thi
Nếu bạn cho rằng “count luôn tăng,” đây sẽ trở thành một lỗi tinh vi và khó phát hiện.
Giải Pháp: Tách Điều Kiện Khỏi Hành Động
if (isValid) {
count++;
}
Hoặc:
count++;
if (isValid) {
// process
}
➡ Chỉ dùng điều kiện để đưa ra quyết định
7.4 Các Điều Kiện OR Khó Đọc Dẫn Đến Lỗi Trong Tương Lai
Điều kiện sau có thể hoạt động, nhưng rất nguy hiểm:
if (a || b && c || d && e) {
// unclear intent
}
- Độ ưu tiên không trực quan
- Dễ bị phá vỡ khi bảo trì
Ví Dụ Cải Tiến
boolean condition1 = a || b;
boolean condition2 = c || d;
if (condition1 && condition2) {
// much clearer
}
7.5 Tóm tắt Phần
Hầu hết các lỗi liên quan tới OR rơi vào bốn nhóm sau:
- Thứ tự kiểm tra null sai
- Nhầm lẫn
|và|| - Viết các tác động phụ bên trong điều kiện
- Để lại các điều kiện không đọc được như hiện tại
Tránh những lỗi này sẽ đưa bạn gần hơn tới
mã Java an toàn, dễ đọc.
8. Ví Dụ Thực Tế Cho Việc Sử Dụng (Sao Chép & Thử)
Phần này giới thiệu các ví dụ thực tế về điều kiện OR thường dùng trong phát triển thực tế.
Mỗi ví dụ được viết sao cho người mới bắt đầu có thể sao chép và thử ngay.
8.1 Kiểm Tra Đầu Vào (null hoặc Chuỗi Trống)
Khi xử lý đầu vào người dùng hoặc dữ liệu bên ngoài, việc kiểm tra cả null và chuỗi trống là cực kỳ phổ biến.
if (text == null || text.isEmpty()) {
System.out.println("Please enter a value");
}
- Nếu
text == nulllà true text.isEmpty()sẽ không được đánh giá
➡ Một mẫu an toàn sử dụng đánh giá ngắn mạch.
8.2 Kiểm Tra Quyền (Cho Nhiều Vai Trò)
Sử dụng OR khi cho phép một hành động cho nhiều vai trò.
if (isAdmin || isOwner) {
// allowed users only
}
Bạn có thể mở rộng một cách tự nhiên khi số lượng vai trò tăng lên:
if (isAdmin || isOwner || isEditor) {
// permission granted
}
8.3 Kiểm Tra Trạng Thái (Hủy Nếu Bất Kỳ Điều Kiện Nào Xấu)
Các điều kiện OR cũng lý tưởng cho các trường hợp mà nếu bất kỳ trạng thái đơn lẻ nào xấu, quá trình nên dừng lại.
if (isTimeout || isError || isDisconnected) {
return;
}
- Độ đọc cao
- Trả về sớm giữ cho logic sạch sẽ
➡ Một mẫu rất phổ biến trong thực tế.
8.4 Các Điều Kiện Được Thiết Kế Để Tránh Ngoại Lệ
Sử dụng OR để gọi phương thức một cách an toàn dựa trên trạng thái của đối tượng.
if (user == null || user.isGuest()) {
showGuestPage();
}
- Đặt kiểm tra null ở phía trái
- Phần bên phải chỉ chạy khi an toàn
Đây là một kết hợp cổ điển của OR và đánh giá ngắn mạch.
8.5 OR với Cờ Bit (Khi | Thích Hợp)
Có những trường hợp bạn cần OR bitwise, không phải OR logic.
int READ = 1; // 0001
int WRITE = 2; // 0010
int EXEC = 4; // 0100
int permission = READ | WRITE;
Mẫu này được sử dụng để kết hợp:
- cờ cấu hình
- quyền
- cờ trạng thái
Trong những trường hợp này, | là toán tử đúng.
8.6 Tóm Tắt Phần
Khi viết các điều kiện OR trong dự án thực tế, hãy nhớ những ý tưởng sau:
- Đặt kiểm tra null ở phía trái
- Nhóm các điều kiện liên quan với OR
- Sử dụng trả về sớm để đơn giản hoá logic
- Giữ các điều kiện an toàn, đơn giản và không có tác dụng phụ
9. Tóm Tắt (Với Bảng Tham Khảo Nhanh)
Cho đến nay, chúng ta đã đề cập chi tiết khái niệm và cách sử dụng các điều kiện OR trong Java. Để kết thúc, hãy tổ chức những điểm chính bạn cần trong phát triển thực tế.
9.1 Tham Khảo Nhanh: || vs |
| Operator | Primary Purpose | Short-Circuit | Typical Usage |
|---|---|---|---|
|| | Logical OR | Yes | Conditional branching (if) |
| | Bitwise OR | No | Bit flags, numeric bit operations |
Quy tắc quyết định rất đơn giản:
- Nhánh điều kiện →
|| - Biến đổi bit →
|
Hầu như không bao giờ có lý do tốt để sử dụng | trong các điều kiện boolean.
9.2 Các Quy Tắc Cơ Bản Khi Viết Các Điều Kiện OR
Để viết các điều kiện OR an toàn trong Java, hãy nhớ các quy tắc sau:
- Luôn đặt kiểm tra null ở phía trái
- Viết code giả định đánh giá ngắn mạch
- Không bao giờ đặt tác dụng phụ trong điều kiện
- Phân tách hoặc trích xuất phương thức khi điều kiện trở nên phức tạp
- Luôn sử dụng dấu ngoặc khi trộn AND và OR
Nếu bạn chỉ tuân thủ những quy tắc này, ngay cả người mới bắt đầu cũng có thể viết code Java an toàn, rủi ro thấp.
9.3 Kết Luận Một Câu Mà Người Mới Bắt Đầu Nên Nhớ
Trong một câu, kết luận của bài viết là:
Trong Java, sử dụng
||cho các điều kiện OR, hiểu đánh giá ngắn mạch, và viết các điều kiện theo thứ tự an toàn.
Bạn không cần ghi nhớ mọi quy tắc. Nếu bạn hiểu tại sao các điều kiện được viết theo một thứ tự nhất định, code đúng sẽ tự nhiên xuất hiện.
10. CÂU HỎI THƯỜNG GẶP (FAQ)
10.1 Tôi có thể viết OR dưới dạng or trong Java không?
Không, bạn không thể. Trong Java, các điều kiện OR luôn được viết bằng ký hiệu.
- OR logic:
|| - OR bitwise:
|
Từ khóa or không tồn tại trong Java.
10.2 Nên dùng cái nào: || hay |?
Luôn sử dụng || trong các câu lệnh if và nhánh điều kiện.
| dùng cho các phép toán bit. Việc dùng nó trong điều kiện sẽ tắt đánh giá ngắn mạch và thường gây lỗi.
10.3 Tại sao phía bên phải của || đôi khi không được thực thi?
Bởi vì || sử dụng đánh giá ngắn mạch.
- Nếu phía trái là
true, kết quả đã được xác định - Phía bên phải không được đánh giá
Đây là hành vi đúng theo đặc tả của Java.
10.4 a && b || c được đánh giá như thế nào?
Vì && có độ ưu tiên cao hơn ||, nó được đánh giá như sau:
(a && b) || c
Nếu ý định không rõ ràng, luôn thêm dấu ngoặc.
10.5 Có nên dùng | với boolean không?
Việc này về mặt cú pháp là hợp lệ, nhưng rất không được khuyến khích.
- Không có đánh giá ngắn mạch
- Độ đọc thấp hơn
- Dễ gây ra lỗi hơn nhiều
Trừ khi bạn có lý do rất cụ thể, luôn sử dụng || cho logic boolean.
10.6 Khi nào tôi nên dùng OR bitwise (|)?
Các trường hợp sử dụng điển hình bao gồm:
- Quản lý các cờ quyền
- Kết hợp các giá trị cấu hình
- Đại diện trạng thái bằng các bit
Đây là hoàn toàn các trường hợp sử dụng khác so với việc rẽ nhánh có điều kiện.

