본문 바로가기
Java관련/Java

Objects.requireNonNull() - java.util.Objects

by devstep 2022. 4. 16.

Objects.requireNonNull() 사용 이유

Objects.requireNonNull() 메서드 코드

public static <T> T requireNonNull(T obj) {
   if (obj == null)
           throw new NullPointerException();
   return obj;
}

당연하게 느껴지는 코드이고, null일 때 당연히 NPE가 발생하는데 왜 사용해야 할까?

명시성 explicity

null이 아니어야 함을 명시적으로 표현할 수 있다.
따라서 과거에 짠 코드가 미래에 사용될 때 해당 객체가 null이면 안된다는 것을 개발자가 명시적으로 알 수 있다.

card.setId(Objects.requireNonNull(keyHolder.getKey()).longValue());

fail-fast

fail-fast란 장애가 발생한 시점에서 즉시 파악할 수 있는 것을 뜻한다.

public class Action {
    String status
}

public class Card {
    Action action;

    public Card(Action action) {
        this.action = Objects.requireNonNull(action); 
    }
}
  • Objects.requireNonNull()를 사용할 경우 생성 시점에 바로 NPE 발생한다!
  • Action action = null; Card card = new Card(action); //생성 시점에 바로 NPE발생
  • 사용하지 않는 경우는 객체 생성 시에는 에러가 발생하지 않고, 객체가 사용할 때 에러가 발생한다.
public class Action {
    String status
}

public class Card {
    Action action;

    public Card(Action action) {
        this.action = action;
    }

    public Action getAction(){
        return action;
    }
}

Action action = null;
Card card = new Card(action);  //객체 생성시에는 NPE가 발생하지 않는다. 
Action action = card.getAction(); // NPE 발생

항상 같은 시점에 exception 발생

  • 객체 생성하는 시점에 에러가 발생하여 시스템의 일관성을 높히고 디버깅이 용이해진다.

명시적 NPE가 성능상의 이점

  • JVM이 발견해서 NPE를 발생하는 것보다 명시적인 NPE가 성능상의 이점이 있다고 한다.

'Java관련 > Java' 카테고리의 다른 글

Java 데이터 타입, 변수, 배열  (0) 2022.07.31
NoSuchElementException  (0) 2022.04.16
static  (0) 2022.04.13
로깅 라이브러리 Logging Library  (0) 2022.04.11
정적팩토리 메서드  (0) 2022.04.09

댓글