클린코드에서는 null을 반환하는 것을 지양한다. 그렇게 암묵적으로 동의하는 것만드로도 불필요한 null check 를 방지할 수 있다.
public void registerItem(Item item) {
if (item != null) {
ItemRegistry registry = peristentStore.getItemRegistry();
if (registry != null) {
Item existing = registry.getItem(item.getID());
if (existing.getBillingPeriod().hasRetailOwner()) {
existing.register(item);
}
}
}
}
java 8 부터는 Optional 개념을 도입하여 이러한 문제를 해결하려 한다.
java.util.Optional<T>
클래스Optional 클래스는 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)
메소드 | 설명 |
---|---|
static Optional empty() | 아무런 값도 가지지 않는 비어있는 Optional 객체를 반환함. |
T get() | Optional 객체에 저장된 값을 반환함. |
boolean isPresent() | 저장된 값이 존재하면 true를 반환하고, 값이 존재하지 않으면 false를 반환함. |
static Optional of(T value) | null이 아닌 명시된 값을 가지는 Optional 객체를 반환함. |
static Optional ofNullable(T value) | 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환함. |
T orElse(T other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환함. |
T orElseGet(Supplier<? extends T> other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환함. |
T orElseThrow(Supplier<? extends X> exceptionSupplier) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴. |
class LunchBox {
private LunchBox lunchBox;
public LunchBox getLunchBox() {
return lunchBox;
}
}
class Beverage {
private Beverage beverage;
public Beverage getBeverage() {
return beverage;
}
}
class Person {
private String name;
public String getName() {
return name;
}
}
Person person = new Person();
String beverageName = person.getName().getBeverage().getLunchBox(); //npe 발생
class LunchBox {
private Optional<LunchBox> lunchBox = Optional.empty();
public Optional<LunchBox> getLunchBox() {
return lunchBox;
}
}
class Beverage {
private Optional<Beverage> beverage = Optional.empty();
public Optional<Beverage> getBeverage() {
return beverage;
}
}
class Person {
private String name;
public String getName() {
return name;
}
}
// 호출 법
Person person = new Person();
String beverageName = person.getName()
.flatMap(LunchBox::getLunchBox)
.map(Beverage::getBeverage)
.orElse("unknown");
출처: https://mangkyu.tistory.com/203 [MangKyu's Diary]
클린코드, NULL을 반환하거나 인수로 전달하지 마라. 그리고 Java 8 Optional
tcpschool
[Java] 언제 Optional을 사용해야 하는가?
[자바 고급 스터디 1주차 - 3부] Stream과 Optional