개요
사내 CMS를 리팩토링하고 JDK8에서 JDK17로 업그레이드하는 동안 Sonarlint 플러그인에서 경고 메시지를 받았습니다. 아래 사진을 보면 collect(toList())를 toList()로 교체하도록 권고하는데 그 이유는 무엇인지와 항상 toList()를 써야 하는지에 대해 배워보겠습니다.
Collectors.toList()
메소드의 주석을 살펴보면 아래와 같은 문장이 적혀 있습니다.
There are no guarantees on the type, mutability, serializability, or thread-safety of the List retunred
Collectors.toList()의 리턴은 타입, 가변성, 직렬 가능성, 스레드 안정성에 대한 보장이 없다는 뜻입니다. 한 마디로, 반환 결과가 수정이 가능하다는 뜻입니다.
Stream.toList()
toList() 메소드는 JDK 16에 추가된 메소드입니다. Collectors.toList()와 마찬가지로 내부 반복을 통해 리스트를 생성합니다. 하지만 UnmodifiableList를 반환한다는 차이점이 있습니다. 그렇기 때문에 리스트를 수정하려고 하면 UnsupportedOperationException이 발생합니다.
Collectors.toUnmodifiableList()
JDK10에 추가된 메소드이며 Stream.toList()와 다른 점은 null을 허용하지 않는다는 점입니다. 만약 null이 들어오게 되면 NPE를 발생시킵니다.
결론
Effective Java의 아이템 17을 보면 변경 가능성을 최소화하라는 말이 있습니다. 불변을 사용하게 되면 오류가 생길 여지가 적고 안전하다고 합니다. 또한, 전체 코드를 보지 않더라도 '이 리스트는 수정 될 가능성이 없구나' 하고 파악이 되어 가독성이 좋아진다고 생각합니다.
JDK16 이상을 쓰면 별다른 이유가 없으면 Stream.toList()를 쓰는 것이 좋다고 생각합니다.
'Programming > Java' 카테고리의 다른 글
[Java] 문자열 형변환 비교 (0) | 2023.10.30 |
---|