https://github.com/pinpoint-apm/pinpoint
GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed systems.
APM, (Application Performance Management) tool for large-scale distributed systems. - GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed sys...
github.com
오픈소스인 pinpoint의 코드를 분석하던 중 중간중간 Objects.requireNonNull으로 null 여부를 처리하는 부분을 볼 수 있었다.
이펙티브 자바를 읽다가 나왔던 부분이기도하다. 왜 이렇게 처리했을까?
1) 빠른실패(Fail-Fast)
public String selectA(String text){
//로직1
selectB(text);
}
public String selectB(String text){
//로직2
selectC(text);
}
public String selectC(String text){
//로직3
System.out.println(text);
}
위와 같은 코드가 있다고 가정해 보자.
selectA -> selectB -> selectC로 호출하고 있다. 이때 selectA에서 null을 넘겨준다면?
selectC에 도달해야 해당 NPE이 발생하는 것을 볼 수 있다.
public String selectA(String text){
//로직1
selectB(Objects.requireNonNull(text));
}
public String selectB(String text){
//로직2
selectC(text);
}
public String selectC(String text){
//로직3
System.out.println(text);
}
위와 같이 변경한다면 selectC까지 호출하기 전 selectA에서 NPE가 발생하는 것을 볼 수 있다. 이처럼 Objects.requireNonNull을 사용하면 실패지점을 빠르게 파악할 수 있다.
2) 명시적인 예외 처리 && 가독성 및 유지 보수성
Objects.requireNonNull을 사용하면 널 값이 발견되면 명시적으로 NullPointerException을 발생시킨다. 이를 통해 널 값으로 인한 문제를 신속하게 파악하고 디버깅이 가능하다. Null Check는 일반적으로 많은 코드에서 반복적으로 수행되어야 하는 작업이다.
public void process(String data) {
Objects.requireNonNull(data, "data parameter must not be null");
// data를 처리하는 코드 작성
}
public void process(String data) {
if(data == null) {
throw new NullPointerException("data parameter must not be null");
}
// data를 처리하는 코드 작성
}
위 두 코드 중 첫 번째가 가독성이 더 좋아 보인다. 이렇게 Objects.requireNonNull을 사용하면 Null Check를 간단하고 명확하게 표현할 수 있으며, 코드의 의도를 명확하게 전달할 수 있다.
끝!
'혼자 공부하는 것들 > JAVA' 카테고리의 다른 글
ConcurrentHashMap의 get(), put() 분석 (0) | 2023.07.02 |
---|---|
Java11 람다식에서 VAR를 사용할 수 있다고? (0) | 2022.07.02 |
가변인수는 신중하게! (3) | 2022.03.16 |
익명 클래스하고 람다식은 어떤 상황일 때 사용해야할까? (2) | 2022.03.10 |
[동시성 이슈해결] HashMap보다는 ConcurrentHashMap을 쓰자! (0) | 2022.01.01 |
댓글