Cách sạch nhất để chuyển đổi một biến boolean trong Java?


211

Có cách nào tốt hơn để phủ nhận một boolean trong Java hơn là một if-other đơn giản không?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

ồ, tôi cũng định hỏi một câu hỏi tương tự, mặc dù câu hỏi của tôi sẽ dành riêng cho javascript / as3 hoặc ECMAScript nói chung tôi cho rằng ... sẽ dễ dàng bị câu hỏi này che lấp.
matt lohkamp

Nếu không có thì sao! nhà điều hành ??
onmyway133

Câu trả lời:


537
theBoolean = !theBoolean;

16
Đó là ... rất rõ ràng, rất tiếc! Không biết tại sao tôi không nghĩ về nó. Cảm ơn.
Kevin Griffin

! Boolean dường như là một lựa chọn tự nhiên - có thể trong tương lai.
matt lohkamp

21
@ypnos : !!bool == !(!(bool)) == bool.
Christoffer Hammarström

12
@ Christoffer Hammarström Theo logic đó, thì không nên --integer == - (- (số nguyên)) == số nguyên?
dùng515655

1
@ user515655 - Ngôn ngữ xác định --toán tử (thực ra, hai trong số chúng, cùng với hai ++toán tử), nhưng không định nghĩa !!toán tử. Nếu bạn muốn -(-(integer))bạn có thể sử dụng khoảng trắng giữa hai -ký tự. Nhưng !!phân tích như hai !toán tử bất kể khoảng trắng.
Ted Hopp

164
theBoolean ^= true;

Ít tổ hợp phím hơn nếu biến của bạn dài hơn bốn chữ cái

Chỉnh sửa : mã có xu hướng trả về kết quả hữu ích khi được sử dụng làm thuật ngữ tìm kiếm của Google. Các mã ở trên không. Đối với những người cần nó, XOR bitwise như được mô tả ở đây .


14
và nó phù hợp với DRY :)
Tetha

6
Brevity là linh hồn của trí thông minh.
Paul Brinkley

7
bây giờ tôi có thể tự tay thả tên (cú pháp thả?) XOR để trông thật ngầu trước những người bạn lập trình viên của tôi. Câu trả lời của bạn nên được hợp nhất với người được chọn, cùng với đó là sự hoàn hảo thuần túy.
matt lohkamp

6
@ScottStanchfield Những người như vậy nên học nó. Nó không khó chút nào, nó không hack và không biết nó thường dẫn đến mã tào lao, ví dụ như câu hỏi này. Đây là một vụ nổ thực sự - năm dòng sử dụng các quy ước tiêu chuẩn!
maaartinus

4
Thao tác này cũng nhanh hơn 12% so với các phiên bản khác như theBoolean = !theBoolean;hoặctheBoolean = theBoolean ? false : true;
Blaine Kasten

32

Có một vài

Cách "rõ ràng" (đối với hầu hết mọi người)

theBoolean = !theBoolean;

Cách "ngắn nhất" (hầu hết thời gian)

theBoolean ^= true;

Cách "trực quan nhất" (không chắc chắn nhất)

theBoolean = theBoolean ? false : true;

Thêm: Chuyển đổi và sử dụng trong một cuộc gọi phương thức

theMethod( theBoolean ^= true );

Vì toán tử gán luôn trả về những gì đã được gán, nên điều này sẽ chuyển giá trị qua toán tử bitwise, và sau đó trả về giá trị mới được gán sẽ được sử dụng trong lệnh gọi phương thức.


Bao bọc việc thực hiện trong một hàm / phương thức được gọi là chuyển đổi và sau đó gần như không có cách nào để nhầm lẫn nó.
Lambage

@Reiner: Để dứt khoát C, nhưng trong Javađó không được phép trộn boolean và số nguyên (cũng có những thứ như while(1)không thể có trong Java).
Levite

@Lambage: Đúng, nhưng về nhược điểm, bạn không thể chuyển đổi một boolean bằng cách đơn giản chuyển nó, vì không thể truyền các nguyên hàm bằng cách tham chiếu trong Java. Bạn sẽ phải gán lại kết quả của phương thức cho biến của mình hoặc nếu không thì tạo một lớp bao bọc cho boolean.
Levite

"Cách rõ ràng" ở trên bị đánh dấu bởi SONAR với - Nên tránh các bài tập bên trong.
Orby

2

Nếu bạn sử dụng các giá trị BLLean NULL và coi chúng là sai, hãy thử điều này:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

Nếu bạn không trao các giá trị NULL Boolean, hãy thử điều này:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

Đây là sạch nhất vì chúng thể hiện ý định trong chữ ký phương thức, dễ đọc hơn so với ! toán tử, và có thể dễ dàng gỡ lỗi.

Sử dụng

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

Tất nhiên, nếu bạn sử dụng Groovy hoặc một ngôn ngữ cho phép các phương thức mở rộng, bạn có thể đăng ký một tiện ích mở rộng và chỉ cần làm:

Boolean b = false
b = b.toggle() // == true

Cách tiếp cận tốt, nhưng không hoàn toàn rõ ràng (imho). Đối với ai đó sử dụng / đọc chỉ "chuyển đổi (..)" có thể nghĩ, việc gọi phương thức (không gán lại cho biến) có thể đã chuyển đổi biến cơ bản. Rõ ràng với chúng ta ngay bây giờ khi nhìn thấy mã, nhưng trong cuộc sống thực có thể khá khó để gỡ lỗi. Một tên phương thức tốt hơn có thể là "ngược lại" hoặc có thể là "phủ định", để làm cho điều này rõ ràng hơn một chút; hoặc sử dụng cách tiếp cận đầu tiên với một đối tượng Booleanvà thực sự chuyển đổi nó trong phương thức (nhưng vẫn hơi mơ hồ).
Levite

2

Câu trả lời này được đưa ra khi tìm kiếm "java invert boolean function". Ví dụ dưới đây sẽ ngăn các công cụ phân tích tĩnh nhất định không thể xây dựng do logic phân nhánh. Điều này rất hữu ích nếu bạn cần đảo ngược một boolean và chưa xây dựng các bài kiểm tra đơn vị toàn diện;)

Boolean.valueOf(aBool).equals(false)

Hay cách khác:

Boolean.FALSE.equals(aBool)

hoặc là

Boolean.FALSE::equals

1
Tôi thích thực tế là bạn có thể chuyển Boolean.FALSE::equalsđến một chức năng lập bản đồ thay vì viết một lambda nhỏ
Patrick Parker

0

Nếu bạn không làm gì đặc biệt chuyên nghiệp, bạn luôn có thể sử dụng lớp Util. Ví dụ, một lớp sử dụng từ một dự án cho một lớp.

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

sau đó chỉ cần tạo một đối tượng Util Util u = new Util(); và có một cái gì đó cho sự trở lạiSystem.out.println( u.flip(bool) );

Nếu cuối cùng bạn sẽ sử dụng cùng một thứ, hãy sử dụng một phương thức và đặc biệt là nếu nó xuyên suốt các dự án, hãy tạo một lớp Util. Tuy nhiên, tiêu chuẩn công nghiệp là gì. (Lập trình viên có kinh nghiệm cảm thấy tự do để sửa chữa cho tôi)



-4

Trước:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

Sau:

boolean result = isresult();
result ^= true;

Ai đã từng bỏ phiếu? Bạn có thể vui lòng giải thích lý do cũng?
Nikhil Kumar

11
Hai lý do chính tôi có thể nghĩ về lý do tại sao một người nào đó có thể đánh giá thấp bạn: 1) Sự cần thiết của chủ đề ( thôi nào! Câu hỏi đã được hỏi 7 (!) Năm trước! ) Và câu trả lời của bạn không mang lại điều gì mới cho bảng; 2) Cử tri mong đợi một cái gì đó "sạch hơn" ( đọc: ngắn hơn ) - Câu trả lời của AaronMaenpaa là một ví dụ điển hình cho việc này.
Priidu Neemre

5
@Elltz: Ngược lại - Tôi thực sự đã ủng hộ anh ấy, vì câu trả lời đã đúng về mặt kỹ thuật. Tuy nhiên, tôi phải nói rằng tôi không thích xu hướng trả lời những câu trả lời của người dùng trước vì nghiệp chướng rẻ tiền (xem câu trả lời của nlaq).
Priidu Neemre

@PriiduNeemre, câu hỏi được hỏi & câu trả lời được chấp nhận trước hơn 7 năm và bạn có nghĩ ngoại trừ từ danh sách của bạn không ai sẽ từ bỏ? ngoài ra, câu trả lời của bạn cũng không được đánh dấu .. :(
user1140237

2
sau: kết quả boolean =! isresult ();
Petter Friberg
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.