IT박스

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

itboxs 2020. 6. 5. 21:11
반응형

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컨테이너의 요소를 감싸거나 객체가 필요한 메소드에 대한 인수 래핑하는 데만 사용하십시오.

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

Imagine you need for some reason store a sequence of boolean in an ArrayList, this can be done by boxing boolean in Boolean.

There is a few words about this here

From documentation:

As any Java programmer knows, you can’t put an int (or other primitive value) into a collection. Collections can only hold object references, so you have to box primitive values into the appropriate wrapper class (which is Integer in the case of int). When you take the object out of the collection, you get the Integer that you put in; if you need an int, you must unbox the Integer using the intValue method. All of this boxing and unboxing is a pain, and clutters up your code. The autoboxing and unboxing feature automates the process, eliminating the pain and the clutter.

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


Boolean wrapper is useful when you want to whether value was assigned or not apart from true and false. It has the following three states:

  • True
  • False
  • Not defined which is null

Whereas boolean has only two states:

  • True
  • False

The above difference will make it helpful in Lists of Boolean values, which can have True, False or Null.


I suppose in some case, you should have a mechanism to distinguish a Boolean field which already set value or not.


Main purpose for Boolean is null value. Null value says, that property is undefined, for example take database nullable column.

If you really need to convert everyting from primitive boolean to wrapper Boolean, then you could use following to support old code:

Boolean set = Boolean.FALSE; //set to default value primitive value (false)
...
if (set) ...

There are many uses for the **null** value in the Boolean wrapper! :)

For example, you may have in a form a field named "newsletter" that indicate if the user want or doesn't want a newsletter from your site. If the user doesn't select a value in this field, you may want to implement a default behaviour to that situation (send? don't send?, question again?, etc) . Clearly, not set (or not selected or **null**), is not the same that true or false.

But, if "not set" doesn't apply to your model, don't change the boolean primitive ;)


In a strict definition of a boolean element, there are only two values. In a perfect world, that would be true. In the real world, the element may be missing or unknown. Typically, this involves user input. In a screen based system, it could be forced by an edit. In a batch world using either a database or XML input, the element could easily be missing.

So, in the non-perfect world we live in, the Boolean object is great in that it can represent the missing or unknown state as null. After all, computers just model the real world an should account for all possible states and handle them with throwing exceptions (mostly since there are use cases where throwing the exception would be the correct response).

In my case, the Boolean object was the perfect answer since the input XML sometimes had the element missing and I could still get a value, assign it to a Boolean and then check for a null before trying to use a true or false test with it.

Just my 2 cents.


For all the good answers above, I'm just going to give a concrete example in Java servlet HttpSession class. Hope this example helps to clarify some question you may still have.

If you need to store and retrieve values for a session, you use setAttribute(String, Object), and getAttribute(String, Object) method. So for a boolean value, you are forced to use the Boolean class if you want to store it in an http session.

HttpSession sess = request.getSession(false);
Boolean isAdmin = (Boolean) sess.getAttribute("admin");
if (! isAdmin) ...

The last line will cause a NullPointerException if the attribute values is not set. (which is the reason led me to this post). So the 3 logic state is here to stay, whether you prefer to use it or not.


Boolean can be very helpful when you need three state. Like in software testing if Test is passed send true , if failed send false and if test case interrupted send null which will denote test case not executed .


The best way would be to avoid booleans completely, since every boolean implies that you have a conditional statement anywhere else in your code (see http://www.antiifcampaign.com/ and this question: Can you write any algorithm without an if statement?).

However, pragmatically you have to use booleans from time to time, but, as you have already found out by yourself, dealing with Booleans is more error prone and more cumbersome. So I would suggest using booleans wherever possible. Exceptions from this might be a legacy database with nullable boolean-columns, although I would try to hide that in my mapping as well.

참고URL : https://stackoverflow.com/questions/11185321/when-should-null-values-of-boolean-be-used

반응형