Java

Optional 제대로 된 사용법

토마토계란 2021. 12. 22. 02:13

Optional 사용법

Optional의 의도는 라이브러리 메서드가 반환할 결과값이 '없음'을 명백하게 표현해야 하지만 null을 반환하면 에러가 발생할 수 있는 곳에 반환하는 타입

  1. isPresent() - get() 대신 orElse()/orElseGet()/orElseThrow()
{
    Optional<T> t = ..;

    if(t.isPresent()) return t.get();
    else return null;
}
보다
{
    return t.orElse(null);
}
  1. orElse(new ...) 대신 orElseGet(() → new ...)대부분의 경우 method1(method2()) 가 실행되면 method2()는 method1()보다 먼저, 언제나 실행된다
  2. orElse 는 Optional에 값의 유무와 관계없이 항상 실행되는 코드이다
  3. 단지 값을 얻을 목적이라면 Optional 대신 null 비교
  4. return Optional.ofNullable(status).orElse(READY); 보다 return status != null ? status : READY;
  5. Optional 대신 빈 컬렉션 반환컬렉션을 반환하는 Spring Data JPA Repository 메서드 선언 역시 Optional 보다 비어있는 컬렉션을 반환하는 게 좋다
  6. public interface MemberRepository<Member, Long> extends JPARepository { Optional<List<Member>> findAllByName(String name); } public interface MemberRepository<Member, Long> extends JPARepository { List<Member> findAllByName(String name); }
  7. Optional은 비싸다
  8. 필드로 사용 금지
  9. 필드 목적으로 만들어지지 않았다 Serializable을 구현하지 않았다
  10. 생성자나 메서드 인자로 사용 금지
  11. 컬렉션의 원소로 사용 금지
  12. of(), ofNullable() 혼동 주의
  13. of(A)에서 A가 null이면 NullPointerException이 발생할 것이다
  14. Optional<T> 대신 OptionalInt, OptionalLong, OptionalDouble
  15. boxing, unboxing 이 덜 일어난다