[java] Boolean의 null 값은 언제 사용해야합니까?

자바 boolean의 값을 허용 true하고 false부울 수 있지만 true, false하고 null. booleans를 Booleans 로 변환하기 시작했습니다 . 다음과 같은 테스트에서 충돌이 발생할 수 있습니다.

Boolean set = null;
...
if (set) ...

시험하는 동안

if (set != null && set) ...

생각하고 오류가 발생하기 쉬운 것 같습니다.

Booleans를 null 값과 함께 사용하는 것이 유용한 경우는 언제 입니까? 그렇지 않다면, 포장 된 물체의 주요 장점은 무엇입니까?

업데이트 : 나는 내 자신의 답변으로 그중 일부를 요약 한 귀중한 답변이 많이있었습니다. 나는 자바에서 중간체이기 때문에 내가 찾은 것을 보여 주려고 노력했다. 질문은 “부정확하게 표현되었습니다”(부울은 “널값을 가질 수 없음”)지만 다른 사람들이 동일한 오해를 가지고있는 경우에 대비하여 남겨 두었습니다.



답변

사용 boolean하기보다는 Boolean당신이 할 수있는 모든 시간입니다. 이것은 많은 것을 피하고 NullPointerException코드를 더 강력하게 만듭니다.

Boolean 예를 들어 유용합니다

  • 부울을 컬렉션에 저장하기 (List, Map 등)
  • 예를 들어 데이터베이스의 널 입력 가능 부울 열에서 오는 널 입력 가능 부울을 나타냅니다. 이 값에서 null 값은 “true인지 false인지 모른다”를 의미 할 수 있습니다.
  • 메소드가 Object를 인수로 필요로 할 때마다 부울 값을 전달해야합니다. 예를 들면, 반사 또는 방법을 같이 사용하는 경우 MessageFormat.format().

답변

Boolean그 의미가 모호하고 모호 하기 때문에 거의 사용하지 않습니다 . 기본적으로 3 가지 상태 로직이 있습니다 : true, false 또는 unknown. 예를 들어 사용자에게 두 값 중 하나를 선택할 수 있고 사용자가 전혀 대답하지 않았으며 해당 정보를 알고 싶을 때 (널 (NULL) 입력 가능 데이터베이스 열) 생각할 때 유용합니다.

나는 변환 할 이유 볼 booleanBoolean는 추가 메모리 오버 헤드, NPE 가능성 덜 입력을 소개하면서. 일반적으로 나는 어색한 것을 사용 BooleanUtils.isTrue()하여 내 인생을 조금 더 쉽게 Boolean만듭니다.

존재하는 유일한 이유 BooleanBoolean유형의 콜렉션을 보유 할 수있는 능력입니다 (제네릭은 boolean물론 다른 모든 기본 요소도 허용하지 않습니다 ).


답변

와우, 지구상에서 무엇? 그것은 단지 나입니까? 아니면이 모든 대답이 틀리거나 적어도 오도입니까?

부울 클래스는 부울 프리미티브 유형의 래퍼입니다. 이 랩퍼를 사용하면 오브젝트 또는 제네릭을 허용하는 메소드에서 부울을 전달할 수 있습니다. 즉 벡터.

부울 객체는 절대 null 값을 가질 수 없습니다. 귀하의 경우 참조 부울에가 null이며, 그것은 단순히 부울 생성하지 않았 음을 의미합니다.

이 유용한 것을 찾을 수 있습니다 : http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java

널 부울 참조는 다른 널 참조와 유사한 논리를 트리거하는 데만 사용해야합니다. 세 가지 상태 논리에 사용하는 것은 어색합니다.

편집 : 통지, 그것은 Boolean a = true;오해의 소지가 있습니다. 이것은 자동으로 가까운 것을 Boolean a = new Boolean(true);
참조하십시오 : http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#Autoboxing

아마도 이것은 많은 혼란의 근원입니다.

EDIT2 : 아래의 의견을 읽으십시오. 누구든지 이것을 통합하기 위해 내 대답을 재구성하는 방법에 대한 아이디어가 있다면 그렇게하십시오.


답변

세 가지 빠른 이유가 있습니다.

  • 데이터베이스 부울 값을 나타내려면 true, false또는null
  • xsd:boolean선언 된 XML 스키마의 값 을 나타 내기 위해xsd:nillable="true"
  • 일반 유형을 사용할 List<Boolean>수 있습니다.-사용할 수 없습니다List<boolean>

답변

자신의 질문에 대한 답변 : 답변에서 많은 것을 배웠으므로 내 질문에 대답하는 것이 도움이 될 것이라고 생각했습니다. 이 답변은 나와 같은 문제를 완전히 이해하지 못하는 사람들을 돕기위한 것입니다. 내가 잘못된 언어를 사용하면 나를 수정하십시오.

  • 널 “값”은 값이 아니며 기본적으로 trueand와 다릅니다 false. 객체에 대한 포인터가 없습니다. 따라서 부울이 3 값이라고 생각하는 것은 근본적으로 잘못되었습니다
  • 부울 구문은 약식이며 참조가 객체를 가리키는 사실을 숨 깁니다.

    Boolean a = true;

true객체 라는 사실을 숨 깁니다 . 다른 동등한 과제는 다음과 같습니다.

Boolean a = Boolean.TRUE;

또는

Boolean a = new Boolean(true);
  • 약식 구문

    if (a) ...

는 대부분의 다른 할당과 다르며 a가 객체 참조이거나 기본 일 수 있다는 사실을 숨 깁니다. 물체 인 경우 nullNPE를 피하기 위해 테스트해야합니다 . 나에게 평등 테스트가 있으면 이것을 기억하는 것이 심리적으로 쉽습니다.

if (a == true) ...

여기서 null을 테스트하라는 메시지가 표시 될 수 있습니다. 따라서 단축 된 형태는 a원시적 일 때만 안전 합니다.

나 자신을 위해 지금 권장 사항이 있습니다.

  • 3 값 논리에는 null을 사용하지 마십시오. 참과 거짓 만 사용하십시오.
  • 절대로 Boolean메소드에서 리턴하지 마십시오 null. 만 반환 boolean합니다.
  • Boolean컨테이너의 요소를 감싸거나 객체가 필요한 메소드에 대한 인수 에만 래핑

답변

프리미티브의 래퍼 클래스는 객체가 필요한 곳에서 사용할 수 있으며 컬렉션은 좋은 샘플입니다.

당신이 어떤 이유로 저장소의 순서가 필요 상상 boolean에서을 ArrayList,이 권투하여 수행 할 수 있습니다 boolean에서 Boolean.

여기에 대한 몇 마디가 있습니다

설명서에서 :

Java 프로그래머가 알고 있듯이 int (또는 다른 기본 값)를 컬렉션에 넣을 수는 없습니다. 콜렉션은 오브젝트 참조 만 보유 할 수 있으므로 기본 값을 적절한 랩퍼 클래스 (int의 경우 Integer)로 상자에 넣어야합니다. 컬렉션에서 개체를 가져 오면 삽입 한 정수를 얻게됩니다. int가 필요한 경우 intValue 메소드를 사용하여 Integer를 개봉해야합니다. 이 모든 복싱 및 언 박싱은 고통스럽고 코드를 복잡하게 만듭니다. 오토 박싱 및 언 박싱 기능은 프로세스를 자동화하여 고통과 혼란을 제거합니다.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html


답변

Boolean래퍼는 값이 trueand과 떨어져 있는지 여부를 원할 때 유용합니다 false. 다음과 같은 세 가지 상태가 있습니다.

  • 진실
  • 그릇된
  • 정의되지 않은 null

반면 boolean에 두 가지 상태 만 있습니다.

  • 진실
  • 그릇된

상기 차이는 목록에 유용한 것 Boolean가질 수있는 값 True, False또는 Null.