Optional의 예외처리
- orElse(default)는 Optional 값에 null이 들어올 경우에 orElse의 default 값으로 return
- orElseGet(() -> default)은 Optional 값에 null이 들어올 경우에 default 값으로 return
- orElseThrow는 Optional 객체가 비어있을 경우에 예외를 던짐
-> 그렇다면 orElse와 orElseGet의 차이가 없는건가?
이거에 대한 내용은 "Optional을 올바르게 사용하기 위한 방법을 제공하는 26가지" 글에 나와있다.
1. 값이 없는 경우, Optional.orElse()를 통해 이미 생성된 기본 값(객체)을 반환
public static final String MEMBER_STATUS = "UNKNOWN";
Member member = findById(1).orElse(MEMBER_STATUS);
Member EMPTY_MEMBER = new Member();
Member member = findById(1).orElse(EMPTY_MEMBER);
단, orElse 메소드의 인자는 Option 객체가 존재할 때도 실행된다.
2. 값이 없는 경우, Optional.orElseGet()를 통해 기본 값(객체)을 반환
Member member = findById(1).orElseGet(Member::new);
orElseGet(() -> default) 에서 'default'는 Optional에 값이 없을 때만 실행된다.
3. 값이 없는 경우, Optional.orElseThrow()를 통해 명시적으로 예외을 던짐
값이 없는 경우, 기본 값을 반환하는 대신 예외를 던져야 하는 경우도 있다.
Member member = findById(1).orElseThrow(() -> new NoSuchElementException("Member Not Found"));
자바 10부터는 orElseThrow()의 인수 없이도 사용할 수 있다.
/**
* If a value is present, returns the value, otherwise throws
* {@code NoSuchElementException}.
*
* @return the non-{@code null} value described by this {@code Optional}
* @throws NoSuchElementException if no value is present
* @since 10
*/
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
4. 정리
만약
findById(1).orElse(new Member());
이런식으로 작성이 된다면, new Member는 무조건 실행이 된다.
따라서 orElse(default)는 'default'가 새 객체 생성이나 새로운 연산을 유발하지 않고,
이미 생성되었거나 계산된 값일 때만 사용해야 한다.
- Member::new 는 무엇일까?