2017-04-26 22 views
2

현재 웹 응용 프로그램에서 JSON 객체를 생성 할 때 불변의 라이브러리를 사용하고 있습니다. 왜 불변의 null이 권장되지 않습니까?

this 장에 보면, 첫 번째 줄은 말한다 : 널 (NULL) 속성의

사용은 권장하지 않습니다.

그래서 내 질문은 :

1) 그 이유는 무엇입니까? null 객체가 잘못 되었나요?

2) 항목이 때문에 실패합니다 클래스라는 빌더 코드를 사용하여, 널 (null)인지 아닌지 나는 thirdy 객체의 래퍼를 사용하고 있는데 나도 몰라 어떤 경우 :

MyImmutableWrapperObject 
    .builder(). 
    .mobile(input.getMobile()) // don't know if null or not 
    .build(); 

어떤 최적 있는가 해결책?

편집 :

@JsonProperty("mobile") 
public abstract Optional<String> mobile(); 

... 

// composing builder 
if (input.getMobile() != null) 
     builder.mobile(input.getMobile()); 

생성 된 JSON은 다음과 같습니다

"mobile": { 
    "present": false 
}, 

어떻게 완전히 빈 필드를 제거 할 수 있습니까?

나는 this을 읽었지 만 gson.toJson을 사용하여 나의 객관적인 방법이 아닌 String 객체를 반환합니다.

는 POSTEDIT :

난 그냥도 존재하는 경우 옵션 실제 값을 표시하지 않습니다,하지만 그냥 참/거짓 값을 표시, 그래서 그것을 필요로하지 않는다는 것을 발견했다.

답변

6

정확하게 IMO가 중요합니다. 객체가 null인지 아닌지는 알 수 없습니다. 그래서 나중에 사용하면 분명히 NullPointerException을 얻게 될 것입니다. 이를 금지하는 라이브러리를 사용하면 무언가가 null이 아니거나 null이 아니기 때문에 (null이 아니기 때문에) 신경 쓰지 않아 코드가 적고 잠재적 인 null 검사로 코드를 오염시키는 문구가 줄어든다.

또한 null 참조는 다른 상황에서 다른 것을 의미 할 수 있습니다. 예를 들어, Boolean : true, false 및 아직 설정되지 않은 코드 (null)의 세 가지 상태가 필요한 코드를 보았습니다. 나는 틀린 것을 발견한다, 그러나 때때로 그것을 때때로 본다.

그 이유는 Optional이 구아바에 도입되어 현재 JDK에 포함 된 이유입니다. 사용자가 Optional을 사용하여 적극적으로 작업을 수행하도록합니다. 예를 들어 :

i.get() 

을하지만, 그 방법은 휴식 수 있다는 설명되어 있습니다

Optional<Integer> i... 

    if(i.isPresent()).... // you are forced to do this check 

잘 분명히 당신은 할 수 있습니다.

Integer i = null; 
if(i == null) // this is not an operation that is mandatory 

내가/볼이 주제에 대한 최신 정보를 읽은 내기 문서 그래서 possibile 방법도있을 수 Guava explanation

+0

입니다 : 빌더

같은

은 참조를 위해 단순히 사실이 아니다 builder = ImmutableAccount \t \t \t \t .builder() if (input.getMobile()! = null) builder.mobile (input.getMobile()); builder.build() –

+1

@ FabrizioStellato 반환 할 수 있습니다 - 예. 이 경우에는'Optional.empty()'를 저장하는 것이 옳을 수도 있습니다. 또는 빌더가 대신이 null을 사용하여 작업을 수행 할 수도 있습니다. – Eugene

+0

내 편집 된 질문보기 –