자바 boolean
의 값을 허용 true
하고 false
부울 수 있지만 true
, false
하고 null
. boolean
s를 Boolean
s 로 변환하기 시작했습니다 . 다음과 같은 테스트에서 충돌이 발생할 수 있습니다.
Boolean set = null;
...
if (set) ...
시험하는 동안
if (set != null && set) ...
생각하고 오류가 발생하기 쉬운 것 같습니다.
Boolean
s를 null 값과 함께 사용하는 것이 유용한 경우는 언제 입니까? 그렇지 않다면, 포장 된 물체의 주요 장점은 무엇입니까?
업데이트 : 나는 내 자신의 답변으로 그중 일부를 요약 한 귀중한 답변이 많이있었습니다. 나는 자바에서 중간체이기 때문에 내가 찾은 것을 보여 주려고 노력했다. 질문은 “부정확하게 표현되었습니다”(부울은 “널값을 가질 수 없음”)지만 다른 사람들이 동일한 오해를 가지고있는 경우에 대비하여 남겨 두었습니다.
답변
사용 boolean
하기보다는 Boolean
당신이 할 수있는 모든 시간입니다. 이것은 많은 것을 피하고 NullPointerException
코드를 더 강력하게 만듭니다.
Boolean
예를 들어 유용합니다
- 부울을 컬렉션에 저장하기 (List, Map 등)
- 예를 들어 데이터베이스의 널 입력 가능 부울 열에서 오는 널 입력 가능 부울을 나타냅니다. 이 값에서 null 값은 “true인지 false인지 모른다”를 의미 할 수 있습니다.
- 메소드가 Object를 인수로 필요로 할 때마다 부울 값을 전달해야합니다. 예를 들면, 반사 또는 방법을 같이 사용하는 경우
MessageFormat.format()
.
답변
Boolean
그 의미가 모호하고 모호 하기 때문에 거의 사용하지 않습니다 . 기본적으로 3 가지 상태 로직이 있습니다 : true, false 또는 unknown. 예를 들어 사용자에게 두 값 중 하나를 선택할 수 있고 사용자가 전혀 대답하지 않았으며 해당 정보를 알고 싶을 때 (널 (NULL) 입력 가능 데이터베이스 열) 생각할 때 유용합니다.
나는 변환 할 이유 볼 boolean
로 Boolean
는 추가 메모리 오버 헤드, NPE 가능성 덜 입력을 소개하면서. 일반적으로 나는 어색한 것을 사용 BooleanUtils.isTrue()
하여 내 인생을 조금 더 쉽게 Boolean
만듭니다.
존재하는 유일한 이유 Boolean
는 Boolean
유형의 콜렉션을 보유 할 수있는 능력입니다 (제네릭은 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>
답변
자신의 질문에 대한 답변 : 답변에서 많은 것을 배웠으므로 내 질문에 대답하는 것이 도움이 될 것이라고 생각했습니다. 이 답변은 나와 같은 문제를 완전히 이해하지 못하는 사람들을 돕기위한 것입니다. 내가 잘못된 언어를 사용하면 나를 수정하십시오.
- 널 “값”은 값이 아니며 기본적으로
true
and와 다릅니다false
. 객체에 대한 포인터가 없습니다. 따라서 부울이 3 값이라고 생각하는 것은 근본적으로 잘못되었습니다 -
부울 구문은 약식이며 참조가 객체를 가리키는 사실을 숨 깁니다.
Boolean a = true;
true
객체 라는 사실을 숨 깁니다 . 다른 동등한 과제는 다음과 같습니다.
Boolean a = Boolean.TRUE;
또는
Boolean a = new Boolean(true);
-
약식 구문
if (a) ...
는 대부분의 다른 할당과 다르며 a가 객체 참조이거나 기본 일 수 있다는 사실을 숨 깁니다. 물체 인 경우 null
NPE를 피하기 위해 테스트해야합니다 . 나에게 평등 테스트가 있으면 이것을 기억하는 것이 심리적으로 쉽습니다.
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
래퍼는 값이 true
and과 떨어져 있는지 여부를 원할 때 유용합니다 false
. 다음과 같은 세 가지 상태가 있습니다.
- 진실
- 그릇된
- 정의되지 않은
null
반면 boolean
에 두 가지 상태 만 있습니다.
- 진실
- 그릇된
상기 차이는 목록에 유용한 것 Boolean
가질 수있는 값 True
, False
또는 Null
.