Java8부터 지원한 NPE 방지 wrapper class
// 기존 방식
String name = userRepository.getName();
if (name != null) {
logic(name);
}
// Optional 사용
Optional.ofNullable(userRepository.getName())
.ifPresent((n) -> {
logic(n);
});
isPresent()-get() 대신 orElse()/orElseGet() 등 사용
// not good
Optional<String> name = Optional.ofNullable(userRepository.getName());
if (name.isPresent()) {
return name.get();
} else {
return null;
}
// good
return Optional.ofNullable(userRepository.getName())
.orElse(null);
null 대신 isEmpty() 사용
// not good
Optional<String> name = null;
// good
Optional<String> name = Optional.empty();
Optional<Integer> 대신 OptionalInt 사용(int, long, double)
// not good
Optional<Integer> age = Optional.of(userRepository.getAge());
// good
OptionalInt age = OptionalInt.of(userRepository.getAge());
연산이 필요하거나 객체생성이 수행되는 orElse는 orElseGet 사용
// not bad
int userCnt = Optional.ofNullable(userRepository.getUserList())
.map(List::size)
.orElse(0);
// not good
Optional<User> user = Optional.ofNullable(userRepository.getUser())
.orElse(new User());
// good
Optional<User> user = Optional.ofNullable(userRepository.getUser())
.orElseGet(User::new);
null이 예상되는 경우 of() 대신 ofNullable() 사용
// not good
Optional<User> user = Optional.of(userRepository.getUser()); // null이 반환될 수 있음. NPE 발생.
// good
Optional<User> user = Optional.ofNullable(userRepository.getUser());