Java 7에서 추가된 Objects
의 requireNonNull(T t)
메서드는 파라미터의 null 체크를 위한 메서드로 null을 어떻게든 해보려는 목적에서 Java 8의 Optional과 비슷한 면이 있지만 그 처리는 상당한 차이가 있다. 이번 post에선 requireNonNull
에 대해 다룬다.
메서드에서 null일 가능성이 있는 인자가 있을 때, 이를 메서드 시작 지점에서 체크하여 Exception을 던지고자 하는 경우 다음과 비슷한 코드를 종종 볼 수 있다.
1 | public void nullableParameterMethod (Object object) throws NullPointerException { |
잘 동작할 것처럼 보이는데 이것에서 더 개선할 점이 있을까? Objects.requireNonNull
은 이 코드를 더 편하게 사용하는 것을 목표로 한다.
1 | public void nullableParameterMethod2 (Object object) { |
Objects.requireNonNull(T t)
은 인자 t가 null이 아니면 인자 t를 리턴하고 null이라면 내부에서 NullPointerException을 호출하는 메서드다. 이 정도로는 뭐가 개선된 건지 알기 어렵다. 코드가 아주 약간 줄어들기는 했지만 그게 그렇게 중요할까? 물론 의미는 있다. 메서드를 이해하고 있다면 가독성의 증가라고 생각해볼 수 있을 것이다. 그리 썩 대단해보이지는 않지만 null 체크만이 아니라 다양한 상태 체크가 있다면 좀 도움이 되지 않을까?
같은 이름의 Objects.requireNonNull(T t, String message)
메서드는 예외 상황에 대해 메시지를 추가해준다.
1 | public void nullableParameterMethod3 (Object object) { |
여기까지도 뭐 그냥저냥인 것 같다. 그런데 Java 8에 오면서 lambda 식이 생김으로서 하나의 메서드가 더 생겼다. Objects.requireNonNull(T t, Supplier<String> messageSupplier)
다.
1 | public void nullableParameterMethod4 (Object object) { |
Supplier<T>
는 無인자 單 리턴의 Functional Interface로서 매우 Lazy 하고 싶을 때 쓰기 좋다. return이 String이기만 하다면 그 안에서 여러가지를 할 수 있으므로 검사 대상인 객체가 null일 때 Exception을 던지는 것 말고도 여러가지 작업을 추가할 수 있을 것이다. 그런데 여전히 if (null == object) {...}
에 비해 아주 대단해 보이지는 않는다. 좀 나은 정도? 불필요한 코드 라인 수를 줄이는데 도움이 될 것이다.
다음 post에서는 Optional<T>
에 대해 알아볼 것이다.