Objects.requireNonNull()은 왜 사용해야 할까?
intelliJ로 코딩을 하는데 자꾸 노란줄이 뜨면서
Objects.requireNonNull()을 권장하길래 뭐하는 메서드인지 한번 찾아보았다.
이름에서 알 수 있듯 이 메서드는 non-null을 표시하는 역할을 합니다.
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
requireNonNull메서드의 내부는 다소 충격적이다. 왜냐하면 너무나도 당연한 코드이기 때문입니다.
왜 사용하는걸까??
참조 객체가 null일 때 NPE가 나는 것은 당연한 것이기 때문에 잘 와닿지 않을 수 있습니다.
이를 사용하는 이유는 크게 다음과 같습니다.
explicit
다음과 같이 A를 참조하는 B클래스가 있을 때
public class A {
String name;
}
public class B {
A a;
public B(A a) {
this.a = Objects.requireNonNull(a);
}
}
코드 상에서 A가 null이 아니어야 함을 명시적으로 표현할 수 있습니다.
따라서 과거에 짠 코드가 미래에 사용될 때 해당 객체가 null이면 안된다는 것을 개발자가 명시적으로 알 수 있습니다.
fail-fast
fail-fast란 장애가 발생한 시점에서 즉시 (혹은 최대한 빠르게) 파악할 수 있는 것을 뜻합니다.
위의 B클래스는 다음과 같이 객체 생성 시점에 바로 익셉션이 발생할 것입니다.
A a = null;
B b = new B(a); // 생성 시점에 바로 NPE 발생
반면 다음과 같이 requireNonNull을 사용하지 않은 경우는 어떨까?
public class C{
A a;
public C(A a) {
this.a = a; //Objects.requireNonNull 사용x
}
//...getter
}
바로 익셉션을 발생하지 않고 이후에 해당 객체가 사용될 때 알 수 있게 됩니다.
A a = null;
C c = new C(a);
c.getA(); // 객체 생성 이후에 늦게 NPE 발생
이는 시스템이 복잡해 질 수록 장애를 발견하기 어렵게 만들 수 있습니다.
기타 장점
vs Optional
자바9버전 부터는 다음과 같은 메서드가 추가되면서 Optional과 비슷하게 사용이 가능합니다.
requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
vs @Nonnull
출처