Effective Java를 읽던 도중
this.dictionary = Objects.requireNonNull(dictionary);
라는 코드를 읽고 requireNonNull이 궁금해져서 IDE를 통해 구현을 확인했다.
@ForceInline
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
확인하고 나니 단순히 Null이면 NPE를 날리는게 무슨 의미가 있는거지 싶어서 찾아보게 됬다.
장점으로는
1. Null-Safe 하게 객체를 사용가능하다.
2. 빠르게 실패를 확인 가능하다.
가 있었다.
먼저, 1번인 Null-Safe야 당연하게 null을 체크하고 난 이후 객체를 사용하게 될태니 가장 주 목적이면서도 당연한 점이라고 생각이 든다.
2번의 경우에는 빠르게 실패를 확인 가능하다는데 이는 만약 내가 객체를 주입 받고 사용하는 지점에서 사용하다 null인 것을 알고 사용하고 된다면 그 라인에서 에러가 나게 되고 이는 오류를 찾는데 조금 더 시간을 걸리게 한다. 하지만, 주입시 바로 NPE를 체크하면서 확인해놓으면 주입 당시에 이미 null 이라는 것을 확인하게 되고 어느 곳에서 주입하다 에러가 났는지 알 수 있게 되는 것이다.
이렇게 확인하고 나니 그럼 사용을 했었던 Optional 과는 또 어떻게 다르게 쓰는지 찾아보게 됬다.
둘 다 NPE를 조심하기 위해 만들어 진 것은 같지만 requireNonNull 같은 경우는 절대적으로 null을 허용하지 않는 공간에서 체크하기 위해 사용하고, Optional은 null 일수도 있는 객체(예를 들어 DB에서 쿼리를 날렸는데 조건에 맞는 엔티티가 없어서 null인 경우 등등..)에 null 방지를 위해서 사용한다.
'Programming > JAVA' 카테고리의 다른 글
Java HashSet에서 HashCode를 변경하게 되면... (0) | 2023.01.03 |
---|---|
Java Equals 정의시 getClass() or instanceof (0) | 2023.01.02 |