null 대신 비어 있는 값 || 값이 없음을 의미 있게 표현할 수 있는 새로운(?) 대안
첫 번째, null은 아무런 의미가 없다.
여기서 “의미”가 없다는 것은 null이 올바른 값인지 잘못된 값인지 판단을 내릴 수 있는 정보가 없다라는 것이다.
Optional.of(p);
Optional.ofNullable(p)
Person p = null;
두 번째, 가독성이 떨어진다.
null 여부를 검증하기 위한 코드를 작성하기 위해서 우리의 코드를 if-else로 떡칠 해야 한다..! 무작정 if-else문이 잘못 되었다고 말할 수는 없지만, if-else문이 가독성과 유지보수성을 떨어트리는 것은 사실이니깐..
예시 코드; if-else 분기
Person black = new Person(new Car(new Insurance("JinoLife"));
public String getInsuranceInfo(Person p){
if(p != null){
Car c = p.getCar();
if(c.getInsurance() != null){
Insurance i = c.getInsurance();
return i.getInsuranceName();
}
}
return "Unknown";
}
예시 코드; Optional
Person black = new Person(new Car(new Insurance("JinoLife"));
public String getInsuranceName() {
return this.car.map(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
}
메서드 Return Type
public interface JpaOrderRepository extends JpaRepository<Order, Long> {
public Optional<Order> findById(String uuid);
}
Getter의 Return Type
class Person {
private Car car;
public Opitonal<Car> getCar(){
return this.car;
}
}
매우 단순한 로직에 대한 로컬 변수
Optional.ofNullable(account)
.ifPresent(acc -> processAccount(acc));
if(account != null) processAccount(account);
클래스 필드나 메서드 파라미터
class Person {
private Optional<Car> car;
public Opitonal<Car> getCar(){
return this.car;
}
}
Optional
은 반환 값이 있을 수도 없을 수도 있는 상황을 표현하기 위해 설계되었다. 메소드 인자로 사용하면 본래 목적과 맞지 않다.Optional
을 인자로 사용하면 코드의 복잡성이 증가하고 가독성과 유지보수성이 저하된다.Optional
을 반환 타입으로 사용하는 것이 관례다. 인자로 사용하는 것은 표준 관례를 위반하는 것이다.