Optional 정리
2021, Sep 09
java optional java8
참조 블로그 :
effective java에서도 말하고 있지만, optional은 API 클라이언트에게 리턴값이 없음을 알려주는 기능에 초점을 맞춰야한다. 검사예외와 비슷한 취지의 쓰임으로 이해하면 된다.
참조 블로그 본문 내용 중
:: orElse(new …) 대신 orElseGet(() → new …)
orElse(new …) 대신 orElseGet(() → new …) 를 사용하도록 설명하는 부분이 있다.
이유는 orElse에 있는 값의 존재유무를 불문하고 무조건 실행되기 때문인데.
아래의 경우는 예외이다.
@Slf4j
@RequiredArgsConstructor
@Service
public class KakaoMessageAdapterService {
private final List<KakaoMessageAdapterHandler> kakaoMessageAdapterHandlers;
private ThirdPartyMessage getThirdPartyMessage(KakaoMessage kakaoMessage) {
KakaoMessageAdapterHandler kakaoMessageAdapterHandler = kakaoMessageAdapterHandlers.stream()
.filter(handler -> handler.filter(kakaoMessage.getType().getThirdPartyMessageType()))
.findFirst()
.orElse(kakaoEtcMessageService);
return kakaoMessageAdapterHandler.send(kakaoMessage);
}
}
- flow
- thirdparty messsage type별로 KakaoMessageAdapterHandler를 상속받아서 구현체가 존재한다.
- 만약에 특정 type에 구현체가 존재하지 않는다면, kakaoEtcMessageService가 kakaoMessageAdapterHandler의 구현체가 된다.
- 위의 경우 , filter로 선 체크 후 → findFirst하고 있는데 이미 구현체들을 filter로 통과시키기 때문에 무의미하게 kakaoEtcMessageService를 호출하고 있지 않다.
:: 단지 값을 얻을 목적이라면 Optinal 대신 null 비교
optinal api가 생겼다고, 무조건 wrapping을 한다든지 남용하면 안된다.
optional은 비용이 발생하므로 단순 null체크는 null로 하자.
The Mother of All Bikesheds: Stuart Marks
- 절대로 Optional 변수와 반환값에 null을 사용하지 말라
- Optional에 값이 들어 있다는 것을 확신하지 않는 한 Optional.get()을 쓰지 말라
- Optional.isPresent()이나 Optionial.get() 외 API를 가능한 사용하라.
- Optional에서 여러 메서드를 연속해서 호출하고 값을 얻기 위한 Optional을 생성하는 것은 권장하지 않는다.
- Optional로 값을 처리하는 중에 그 안에 중간값을 처리하기 위해 또 다른 Optional이 사용되면 너무 복잡해진다.
- Optional을 필드(직렬화가 안되기 떄문에), 메서드 매개변수, 집합 자료형에 쓰지말라.
- 집합 자료형(List, Set, Map)을 감싸는 데 Optional을 쓰지 말고 집합을 사용해라.