이번 리팩토링은 자바8부터 도입되어 사용되고 있는 Optional을 활용해 리팩토링을 진행했습니다.
자바 병렬 프로그래밍
을 작성했던, 브라이언 게츠의 말을 빌려 좋은 Optional과 주의해야할 Optional에 대해 정리해보았습니다
public final class Optional<T> {
/**
* If non-null, the value; if null, indicates no value is present
*/
private final T value;
package refactoring5;
public class CheckNullPointException {
public static void main(String[] args) {
Animal myAnimal = new Animal();
String myAnimalName = myAnimal.getName();
if(myAnimalName.length() == 3){
System.out.println("세글자다!");
} else {
System.out.println("아니다!");
};
}
}
if(myAnimalName != null){
// ... 로직 처리
}
String myAnimalName = Optional.ofNullable(myAnimal.getName())
.orElseGet(()-> "NoName");
String myAnimalName = Optional.ofNullable(myAnimal.getName()).orElse("내꺼");
String yourAnimalName = Optional.ofNullable(myAnimal.getName()).orElseGet(()->"너꺼");
System.out.println("내 애니멀은 : " + myAnimalName);
System.out.println("너 애니멀은 : " + yourAnimalName);
내 애니멀은 : 내꺼
너 애니멀은 : 너꺼
orElseGet() 메서드를 살펴보면 Supplier 인자를 받고 있고, 이는 함수형 인터페이스인 람다식을 매개변수로 받는 것이다.
/**
* If a value is present, returns the value, otherwise returns the result
* produced by the supplying function.
*
* @param supplier the supplying function that produces a value to be returned
* @return the value, if present, otherwise the result produced by the
* supplying function
* @throws NullPointerException if no value is present and the supplying
* function is {@code null}
*/
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
orElse()를 사용할 시 주의할 점은, Optional 인자가 null이 아니어도 무조건 실행된다.
출력된 결과를 통해 이를 확인할 수 있다.
// 무조건 실행되는 orElse()
Animal hisAnimal = new Animal();
hisAnimal.setName("초코");
String hisAnimalName = Optional.ofNullable(hisAnimal.getName()).orElse(checkPlay());
System.out.println("그의 애니멀은 : " + hisAnimalName);
NULL이 아니더라도 무조건 실행
그의 애니멀은 : 초코
우리의 의도는 "결과 없음"을 표현할 명확한 방법이 필요한 라이브러리 메서드 반환 유형에 제한된 메커니즘을 제공하는 것이었습니다.
그러한 유형에 null을 사용하는 것은 오류를 유발할 가능성이 압도적으로 높았습니다.
NEVER call Optional.get unless you can prove it will never be null; instead use one of the safe methods like orElse or ifPresent
참고자료
1. [Java] Optional이란? Optional 개념 및 사용법 - (1/2)
2. 브라이언 게츠의 스택오버플로우 답변
3. Optional 클래스