Java에서 Queue를 사용할 때, 가장 앞 요소를 가져오는 메소드는 poll()과 remove() 두 가지가 있다.
Queue가 빈 상태일때, 두 메소드의 차이를 볼 수 있다.
poll()은 null을 반환하고 remove()은 NoSuchElement Error를 반환한다.
어떤 상황에서 어떤 선택을 해야할지 고민이 됐다.
null로 인해 발생되는 NPE은 예방하는 것이 중요하다고 본 것이 기억났기 때문이다.
이에 대한 힌트를 stackoverflow에서 얻었다.
Queue가 비어있을 것으로 예상되는 경우에는 poll()을 사용하는 것이 적절하고
그 반대의 경우에는 remove()를 사용하는 것이 적절하다고 한다.
예외처리가 많은 비용을 요구하기 때문이다.
Queue가 종종 빈다는 사실을 개발자가 알고 있다면, 예외처리 대신, 다른 방식으로 구현하는 것이 더 바람직하다.
그러나 Queue가 비는 것을 생각하지 않는 경우에는 예외처리를 수행한다면, code flow를 방해하는 null 검사 등의 코드를 작성하지 않아도 되기 때문에 더 효과적이다.
그래서 NPE를 피하기 위한 poll() 사용법을 생각해보았다.
int val에 queue.poll()의 정수가 있으면 그 값을 없으면 -1을 넣는 코드이다.
첫번째 방법은 Optional class로 한 번 감싸 null의 존재를 없앤 방식이다.
두번째 방법은 레퍼런스 타입인 Integer에 poll()을 담은 후 if문으로 처리한 경우이다.
세번째 방법은 queue.isEmpty()와 if문으로 처리한 경우이다.
// #1
int val = Optional.ofNullable(queue.poll()).orElse(-1);
// #2
Integer val = queue.poll();
val = (val == null) ? -1 : val
// #3
if (queue.isEmpty()) {
val = -1;
} else {
val = queue.poll();
}
https://m.blog.naver.com/lestat85/220217676199
'개발' 카테고리의 다른 글
Short-circuit evaluation과 Sequence Point (0) | 2022.03.13 |
---|---|
[Spring] 싱글톤 패턴의DIP 위반과 만족 (0) | 2022.02.26 |
코드 실행시간 측정하기 (Java, Python, C, C++) (0) | 2022.01.10 |
[Git] Tracking connection (-set-upstream 명령) (0) | 2021.11.19 |
[Git] Branch (0) | 2021.11.03 |