Java
Optional 제대로 된 사용법
토마토계란
2021. 12. 22. 02:13
Optional 사용법
Optional의 의도는 라이브러리 메서드가 반환할 결과값이 '없음'을 명백하게 표현해야 하지만 null을 반환하면 에러가 발생할 수 있는 곳에 반환하는 타입
- isPresent() - get() 대신 orElse()/orElseGet()/orElseThrow()
{
Optional<T> t = ..;
if(t.isPresent()) return t.get();
else return null;
}
보다
{
return t.orElse(null);
}
- orElse(new ...) 대신 orElseGet(() → new ...)대부분의 경우 method1(method2()) 가 실행되면 method2()는 method1()보다 먼저, 언제나 실행된다
- orElse 는 Optional에 값의 유무와 관계없이 항상 실행되는 코드이다
- 단지 값을 얻을 목적이라면 Optional 대신 null 비교
- return Optional.ofNullable(status).orElse(READY); 보다 return status != null ? status : READY;
- Optional 대신 빈 컬렉션 반환컬렉션을 반환하는 Spring Data JPA Repository 메서드 선언 역시 Optional 보다 비어있는 컬렉션을 반환하는 게 좋다
- 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); }
- Optional은 비싸다
- 필드로 사용 금지
- 필드 목적으로 만들어지지 않았다 Serializable을 구현하지 않았다
- 생성자나 메서드 인자로 사용 금지
- 컬렉션의 원소로 사용 금지
- of(), ofNullable() 혼동 주의
- of(A)에서 A가 null이면 NullPointerException이 발생할 것이다
- Optional<T> 대신 OptionalInt, OptionalLong, OptionalDouble
- boxing, unboxing 이 덜 일어난다