Collections.EMPTY_LIST 의 기능

Collections 클래스에는 다음과 같이 EMPTY_LIST가 정의되어 있습니다. 
EMPTY_LIST는 public 상수이며 EmptyList 타입 입니다.
또한 정적 상수이기 때문에 싱글톤 객체로 이용 됩니다.

EmptyList 클래스는 내부 클래스로 Collections 클래스 내부에 private 접근자로 정의되어 있기 때문에 상수 또는 emptyList() 메서드를 통해서만 접근이 가능합니다.

Collections 클래스 일부 내용
1
2
3
4
5
public static final List EMPTY_LIST = new EmptyList<>();
 
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
cs

EmptyList
EmptyList 또한 List를 구현한 하위 클래스이므로 add()메서드와 get() 메서드가 정의되어 있습니다.
다만 EmptyList는 말그대로 비어있는 List로 사용할 목적으로 구현한 클래스이므로 add()메서드와 get() 메서드를 사용할 수 없도록 예외를 던지게 구현되어 있습니다.
add()시에는 UnsupportedOperationException을 던지며, 따라서 get()을 호출하게 되면 IndexOutOfBoundsException을 던지게 됩니다.

EmptyList 이용하는 이유
프로젝트시 API 설계를 하는 입장이라면 특정 API 실행 후 리턴 하는 값이 List인 경우가 있습니다.
그런데 문제는 다음과 같이 의도치 않게 비어있는 List를 리턴해야하는 경우가 있습니다.

해당 메서드는 DB에서 User객체가 담긴 List를 조회해주는 메서드입니다.
만약 결과가 없는 경우 메서드를 사용하는 클라이언트 클래스에서는 결과가 없다는것을 알 수 있도록 비어있는 List를 통해 전달해 줍니다.
그러나 이처럼 자주 사용되는 API의 경우 비어있는 List 객체일지라도 메모리 낭비가 발생하게 됩니다.
1
2
3
4
5
6
7
8
9
public List<User> findAllUsers(){
    List<User> userList = userService.findAll();
    
    if(userList == null){
        return new ArrayList<User>();
    }
    
    return userList;
}
cs


이때는 다음처럼 Collections.emptyList() 메서드를 이용하면 됩니다.
1
2
3
4
5
6
7
8
9
public List<User> findAllUsers(){
    List<User> userList = userService.findAll();
    
    if(userList == null){
        return Collections.<User>emptyList();
    }
    
    return userList;
}
cs

 

혹은 다음과 같이 직접 상수 형태로 접근도 가능합니다.
1
2
3
4
5
6
7
8
9
public List<User> findAllUsers(){
    List<User> userList = userService.findAll();
    
    if(userList == null){
        return (List<User>)Collections.EMPTY_LIST;
    }
    
    return userList;
}
cs

이렇게 EmptyList를 싱글톤 형태로 제공하게 되면 비어있는 List를 리턴함과 동시에 싱글톤으로 단 하나의 인스턴스만 참조하므로 메모리 낭비도 방지할 수 있게 됩니다.

 

 

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,