Java에서 부울 변수를 전환하는 가장 확실한 방법은 무엇입니까?


211

간단한 if-else보다 Java에서 부울을 무효화하는 더 좋은 방법이 있습니까?

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

내 질문은 javascript / as3 또는 ECMAScript에만 국한되었지만 같은 질문을하려고했지만이 질문으로 쉽게 다루어 질 것입니다.
matt lohkamp

없는 경우 어떻습니까! 운영자 ??
onmyway133

답변:


537
theBoolean = !theBoolean;

16
그것은 ... 정말 명백합니다. 내가 왜 생각하지 않았는지 모르겠다. 감사.
케빈 그리핀

! 부울은 자연스럽게 선택하는 것처럼 보입니다.
matt lohkamp

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

12
@ ChristofferHammarström 그 논리에 따르면 --integer ==-(-(integer)) == integer?
user515655

1
@ user515655-언어는 --연산자 (실제로 두 개와 함께 두 개 ++)를 정의하지만 !!연산자를 정의하지는 않습니다 . 원하는 경우 -(-(integer))-문자 사이에 공백을 사용할 수 있습니다 . 그러나 공백에 관계없이 !!!연산자 로 구문 분석 합니다.
Ted Hopp

164
theBoolean ^= true;

변수가 4 글자보다 길면 더 적은 키 입력

편집 : 코드는 Google 검색어로 사용될 때 유용한 결과를 반환하는 경향이 있습니다. 위의 코드는 그렇지 않습니다. 그것을 필요로하는 사람들을 위해 여기에 설명 된 것처럼 비트 XOR 입니다.


14
그리고 그것은 DRY를 준수합니다 :)
Tetha

6
간결함은 지혜의 영혼입니다.
Paul Brinkley

7
이제 나는 프로그래머 친구 앞에서 멋지게 보이기 위해 이름을 떨어 뜨릴 수 있습니다 (구문 삭제?). 귀하의 답변은 선택한 답변과 통합되어야하며 함께 완벽한 것입니다.
matt lohkamp

6
@ScottStanchfield 그런 사람들은 그것을 배워야합니다. 전혀 어렵지 않으며, 해킹이 아니며, 그것을 알지 못하면 종종이 질문과 같은 엉터리 코드로 이어집니다. 이것은 표준 규약을 사용하여 실제 다섯 번입니다.
maaartinus

4
이 작업은 12 % 빠르게 같은 다른 버전보다 theBoolean = !theBoolean;theBoolean = theBoolean ? false : true;
블레인 KASTEN

32

몇 가지가 있습니다

"명백한"방법 (대부분의 사람들)

theBoolean = !theBoolean;

"가장 짧은"방법 (대부분의 경우)

theBoolean ^= true;

"가장 시각적 인"방법 (가장 확실하지 않음)

theBoolean = theBoolean ? false : true;

추가 : 메소드 호출에서 전환 및 사용

theMethod( theBoolean ^= true );

대입 연산자는 항상 할당 된 값을 반환하므로 비트 연산자를 통해 값을 토글 한 다음 메서드 호출에 사용할 새로 할당 된 값을 반환합니다.


토글이라는 함수 / 메서드로 구현을 래핑하면 혼동 할 방법이 거의 없습니다.
Lambage

@Reiner : C확실히, Java부울과 정수를 혼합 할 수는 없습니다 ( while(1)Java에서는 불가능합니다).
레위

@Lambage : True, 그러나 단점은 Java에서 프리미티브를 참조로 전달할 수 없기 때문에 단순히 부울을 전달하여 토글 할 수 없습니다. 메소드의 결과를 변수에 다시 지정하거나 부울에 대한 랩퍼 클래스를 작성해야합니다.
레위

위의 "명확한 방법"은 SONAR에 의해 표시됩니다.-내부 할당은 피해야합니다.
Orby

2

부울 NULL 값을 사용하고 false로 간주하면 다음을 시도하십시오.

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

부울 NULL 값을 전달하지 않으면 다음을 시도하십시오.

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

이들은입니다 깨끗한 그들이 메서드 서명의 의도를 보여 때문에에 비해 쉽게 읽을 수 있습니다 ! 연산자로 쉽게 디버깅 할 수 있습니다.

용법

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

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

물론, Groovy 또는 확장 메소드를 허용하는 언어를 사용하는 경우 확장을 등록하고 간단하게 수행 할 수 있습니다.

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

좋은 접근 방법이지만 완전히 모호하지는 않습니다 (imho). "toggle (..)"을 사용하거나 읽는 사람은 생각할 수 있습니다. 메소드에 변수를 다시 지정하지 않고 호출하면 기본 변수가 이미 토글 될 수 있습니다. 현재 코드를보고있는 것은 분명하지만 실제로는 디버깅하기가 매우 어려울 수 있습니다. 더 나은 메소드 이름은 "반대"또는 "부정"일 수 있으며,이를 좀 더 분명하게 만듭니다. 또는 객체 Boolean와 함께 첫 번째 접근법을 사용 하고 실제로 메소드 내에서 토글합니다 (그러나 여전히 모호합니다).
Levite

2

이 답변은 "java invert boolean function"을 검색 할 때 나타납니다. 아래 예제는 분기 정적 로직으로 인해 특정 정적 분석 도구가 빌드에 실패하지 않도록합니다. 부울을 뒤집어 야하고 포괄적 인 단위 테스트를 작성하지 않은 경우에 유용합니다.)

Boolean.valueOf(aBool).equals(false)

또는 대안 적으로 :

Boolean.FALSE.equals(aBool)

또는

Boolean.FALSE::equals

1
나는 당신이 Boolean.FALSE::equals작은 람다를 작성하는 대신 매핑 함수에 전달할 수 있다는 사실을 좋아합니다
Patrick Parker

0

특히 전문적인 작업을 수행하지 않는 경우 항상 Util 클래스를 사용할 수 있습니다. 예를 들어, 클래스 프로젝트의 util 클래스입니다.

public class Util {


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

}

그런 다음 Util 객체를 만들고 Util u = new Util(); 반환 할 무언가를 갖습니다.System.out.println( u.flip(bool) );

똑같은 것을 계속 사용하려면 메소드를 사용하십시오. 특히 프로젝트 전체에 걸쳐 있다면 Util 클래스를 만드십시오. 그러나 업계 표준이 무엇인지 모르겠습니다. (경험이 풍부한 프로그래머는 자유롭게 고쳐주세요)



-4

전에:

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

후:

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

누가 투표를 한 적이 있습니까? 이유도 설명해 주시겠습니까?
Nikhil Kumar

11
왜 누군가가 당신을 다운 보트했는지 생각할 수있는 두 가지 주된 이유 : 1) 스레드 괴사 ( 계속! 질문은 7 (!) 년 전에 질문되었습니다! ) 2) 유권자는 "깨끗한"무언가를 기대했습니다 ( 읽기 : 더 짧음 )-AaronMaenpaa의 답변이 이에 대한 대표적인 예입니다.
Priidu Neemre

5
@ Eltzz : 반대로-대답이 기술적으로 정확했기 때문에 실제로 그를 찬성했습니다. 그러나 싼 카르마에 대해 이전 사용자의 답글을 부트 레깅하는 경향을 즐기지 않는다고 말해야합니다 (nlaq의 답변 참조).
Priidu Neemre

@PriiduNeemre, 질문 및 답변 7+ 년 전에 수락 및 당신이 목록에서 제외하고 누구든지 공의를 포기할 것이라고 생각하십니까? 이 외에도 당신의 대답은 마크까지
올라가지

2
이후 : 부울 결과 =! isresult ();
Petter Friberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.