String str = null;
System.out.println(str.indexOf("a")); // NullPointerExecption 발생
String str = null;
// 방법1. 예외를 던진다 → 에러가 발생하면, stackTrace를 찍는다. 즉, 리소스 낭비이다
if(str == null) {
throw new IllegalStateException(); // 에러 처리를 강제하게 됨
}
System.out.println(str.indexOf("a"));
// 방법2. 클라이언트 코드에서 null을 확인한다 → 이는 클라이언트에서 놓친다면 에러가 발생할 수 있다
if(str != null) {
System.out.println(str.indexOf("a"));
}
// 방법3. Optional을 리턴한다 (자바 8부터) → 빈 값이 들어올수도 있음을 클라이언트에게 명시 후, 빈 값인 경우에 대한 처리를 강제한다.
Optional<String> strOptinal = Optional.ofNullable(str);
→ Optional을 써서 얻는 메리트가 사라짐!
public void setParameter(Optional<Object> param){
if(param != null) // NullPointerException 가능성 존재하므로 null 체크를 해줘야함
param.ifPresent(p -> this.param = p);
}
// Optional<Node> node; // 이렇게 사용하지 않는다.
/////////////////////////////////////////
// delegation을 사용한다.
// 참조 객체를 통해 메서드를 호출하는 방식을 사용한다.
Node node = node.getNode();
/////////////////////////////////////////
// Node 클래스에 정의되어 있는 메서드
public Optional<Node> getNode() {
return Optional.empty();
}
Optional.of(10); // 내부에서 (un)boxing이 이루어진다 → 성능에 좋지 않다.
OptionalInt.of(10); // 각 primitive 타입에 맞는 클래스를 제공하므로 이를 사용하는 것을 권장한다.
public Optional<Object> getParam() {
// return null; // 이렇게 사용하지 않는다. → getParam 이후 ifPresent() 실행 시, NullPointerException 발생 가능성이 있음
return Optional.empty(); // null을 담고 있는 Optional 객체를 반환하자.
}
// map을 사용한 경우
Optional<Optional<String>> str = optionalOnlineClass.map(OnlineClass::getOptionalString);
Optional<String> optionalString = str.orElse(Optional.empty());
// flatMap을 사용한 경우
Optional<String> optionalStringByFlatMap = optionalOnlineClass.flatMatp(OnlineClass::getOptionalString);
이 포스팅은 백기선님의 더 자바, Java 8을 수강하고 정리한 내용입니다.