if (Objects.isNull(Object)){
...
}
if (Object == null){
...
}
==
연산자를 이용한 방법과, Objects.isNull() 을 이용한 방법 두 가지를 혼용해서
사용하고 있었다.
둘이 어떤 차이가 있고 어떤 방법이 베스트 프랙티스일지 생각해보자.
if (Object == null){
...
}
내부 코드를 보면 == 연산자
를 사용한다.
그럼 == 연산자
와 isNull()
은 무슨차이일까?
API Note를 잘 읽어보면 "이 메소드는 java.util.function.Predicate, filter(Objects::nonNull)로 사용하기 위해 존재합니다." 라고 명시되어 있다.
단순히 Null 체크를 위한 메서드가 아니다. Null 체크를 위한 용도로 사용한다면
API를 만든 목적에 맞지 않는다.
마찬가지로 == 연산자
를 이용해 null 체크를 한다.
추가로 특정 타입인지 검사하는 로직이 들어있다.
무엇보다 큰 단점은 가독성이 좋지 않다 라고 생각한다. 만약 처음 본 사람이 IsEmpty() 라는 이름이 null인지 검사를 해주겠구나! 라고 생각하지 않을 것 이다.
String s1 = null
, String s2 = ""
; 일 때 s1,s2는 전혀 다른 값을 가진다.str ≠ null
!str.isEmpty()
containsText(strt)
즉 null이 아니고, 빈문자열도 아니며, 공백으로만 이루어져 있는 문자열도 아닌 문자열인 경우에만 true를 retrun해준다. 단순 null체크를 넘어서 유효한 문자열인지 검사해주는 메서드이다.
Object의
isNull(), isEmpty() 모두 내부적으로 == 연산자
를 사용한다.
isNull()은 null 체크를 위해 만든 메서드가 아니며,
isEmpty()는 null을 검사하는 것인지 명확하지 않다.
위에 있는 String의 세 메서드는 null체크를 하지 않는다.
따라서 나는 null 체크할 때 == 연산자
를 직접 사용하는 것을 지향하려고 한다.
String 타입인 경우에는 StringUtils.hasText()
사용을 지향하고자 한다.
추가로 이는 스스로 내린 결정은 아니며, 여러 사람에게 질문해서 얻은 답변들과, 관련 메서드들의 코드들을 보고 내린 결론이다. 사내 코드도 참고했다.
왜인지 모르겠지만 평소에 나는 == 연산자
를 사용한 null체크가 좋지 못한 코드라고 생각하고 있었다. 그래서 이를 리팩토링하고자 관련 메서드들의 코드들을 보고, 사람들에게도 물어봤는데 잘못된 생각이란걸 깨달았다.