본문 바로가기
Dev/Article

Java Optional Best Practices

by Luigi.yoon 2022. 6. 9.

원문 : https://okky.kr/article/945382

 

OKKY | Java Optional Best Practices

Optional 변수에 null을 할당하지 마라 1 2 3 4 5 6 7 8 9 10 11 // AVOID public Optional Cart fetchCart () { Optional Cart emptyCart null ; ... }

okky.kr

1. Optional 변수에 null을 할당하지 마라

빈값으로 초기화하려면 Optional.empty()를 사용하자.

 

2. Optional.get()을 사용하기 전에는 반드시 Optional에 값이 있는지 확인해라

cart값이 없으면 cart.get()은 에러를 발생시킨다. 그래서 항상 get() 호출 이전에 isPresent()로 체크를 해줘야한다. Optional이 생긴이유가 null check에서 벗어나기 위함인데 이렇게 사용한다면 결국 다를게 없다. 아래에 나오는 orElse()나 orElseGet()을 사용하자.

 

3. isPresent()-get() 보다는 orElse()

 

4. orElseGet()

첫번째 AVOID는 isPresent()-get()을 피하라는 것이고, 두번째 AVOID는 얼핏보면 문제 없을 것 같지만 orElse()는 status에 값이 있어도 computeStatus()메소드를 호출하기 때문에 orElseGet()을 쓰는 것이 좋다.

 

5. orElseThrow()

orElseThrow()는 Java 10부터 사용가능하다.
이하 버전은 orElseThrow(Supplier<? extends X> exceptionSupplier)를 사용해야한다.

 

6. Optional.ifPresent()

 

7. lamda 사용으로 Optional 얻기

Stream 의 findFirst(), findAny(), reduce() 같은 메소드는 Optional을 리턴한다. 적절히 사용하면
코드의 분리없이 메소드 체이닝을할 수 있다.

 

8. Optional의 과도한 사용

단순 값을 가져오는 메서드에 Optional을 사용하는 것은 Optional의 목적에 맞지않는 과도한 사용이다.

 

9. 필드 선언에 사용하지마라

 

10. 생성자, 메서드, Setter 인자로 사용하지마라

 

11. 빈 Collection이나 Array를 리턴할 때 Optional을 쓰지마라

 

12. 기본자료형에 Optional 제네릭을 사용하지마라

 

13. 동등성(Equality) 비교를 위해 unWrap할 필요가없다.

Optional의 equals 메소드는 내부 값을 비교하도록 구현되어있기 때문에 바로 비교하면된다.


14. Optional 값을 변경하거나 필터링할 때는 스트림 API를 이용하자

  • map()
  • filter, flatMap()

15. indentity 기반 연산을 하지마라

 

  1. Optional은 Value-based class 이므로 equality (==), identity hash-based, synchronization 연산을 하면 예상과 다르게 동작될 수 있다. equals()를 사용하자.