Java에서의 Optional <T>는 nullable 한 'T'타입을 감싸는 Wrapper 클래스로 공식 API문서에서 Note 형식으로
Optional은 기본적으로 "결과 없음"을 분명히 나타내야 할 필요가 있고 사용으로 인해 null 오류가 발생할 가능성이 있는 메서드 반환 유형으로 사용하기 위한 것입니다.
라고 쓰여있지만 사실 이 글만 봤을 때에 어떻게 써야 맞는 건지 혹은 내가 쓰고 있는 방식이 제대로 쓰고 있는 방식인지에 대해 의문점이 들기에 여러 자료 글들을 찾아봤으며 '26 Reasons Why Using Optional Correctly Is Not Optional' 라는 글을 찾게 되었으며 이를 공유하고 또 정리하고자 이 글을 쓰게 되었다.
// 1. Optional값의 초기값에 null을 할당하지 마라
// AVOID
public Optional<Cart> fetchCart() {
Optional<Cart> emptyCart = null;
...
}
// PREFER
public Optional<Cart> fetchCart() {
Optional<Cart> emptyCart = Optional.empty();
...
}
// 2. Optional.get()을 호출하기 전에 값을 가지고 있는지 먼저 체크해라
// AVOID
Optional<Cart> cart = ... ; // this is prone to be empty
...
// if "cart"is empty then this code will throw a java.util.NoSuchElementException
Cart myCart = cart.get();
// PREFER
if (cart.isPresent()) {
Cart myCart = cart.get();
... // do something with "myCart"
} else {
... // do something that doesn't call cart.get()
}
// 3. 값이 없으면 Optional.orElse()를 통해 이미 생성된 기본 객체를 Set/Return한다
// AVOID
public static final String USER_STATUS = "UNKNOWN";
...
public String findUserStatus(long id) {
Optional<String> status = ... ; // prone to return an empty Optional
if (status.isPresent()) {
return status.get();
} else {
return USER_STATUS;
}
}
// PREFER
public static final String USER_STATUS = "UNKNOWN";
...
public String findUserStatus(long id) {
Optional<String> status = ... ; // prone to return an empty Optional
return status.orElse(USER_STATUS);
}
....
반응형