[java] Collections.emptyList () 대 새 인스턴스

실제로, 더 나은처럼 빈 목록을 반환하는 :

return Collections.emptyList();

또는 이렇게 :

return new ArrayList<Foo>();

아니면 이것이 반환 된 목록으로 무엇을 할 것인지에 전적으로 의존합니까?



답변

가장 큰 차이점은 변경 불가능한 목록, 즉 요소를 추가 할 수없는 목록을 Collections.emptyList()반환한다는 것 입니다. ( Java 9에 도입 된 것과 동일합니다. )List.of()

당신이 드문 경우 않는 반환 된 목록을 수정하려면, Collections.emptyList()List.of()따라서 있습니다 하지 좋은 선택이.

계약 (문서)이 명시 적으로 다르게 명시되지 않는 한 불변 목록을 반환하는 것은 완벽하게 좋습니다 (그리고 선호하는 방법).


또한 emptyList() 매번 호출 할 때마다 새 개체를 만들지 못할 수 있습니다.

이 메소드의 구현은 각 호출에 대해 별도의 List 객체를 만들 필요는 없습니다. 이 방법을 사용하면 비슷한 이름의 필드를 사용하는 것과 비슷한 비용이들 수 있습니다. (이 방법과 달리이 필드는 유형 안전을 제공하지 않습니다.)

구현은 emptyList다음과 같습니다.

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

따라서 빈 목록을 반환하는 메서드를 자주 호출하는 경우이 방법을 사용하면 CPU와 메모리 측면에서 성능이 약간 향상 될 수 있습니다.


답변

Java 5.0부터 컨테이너에 요소 유형을 지정할 수 있습니다.

Collections.<Foo>emptyList()

비어있는 빈 목록을 반환하려는 경우이 방법을 사용해야한다는 다른 응답과 동의합니다.


답변

Collections.emptyList 두 버전 사이에 차이가 있으므로 반환 된 값의 사용자를 고려해야합니다.

반환하면 new ArrayList<Foo>항상 개체의 새 인스턴스가 만들어 지므로 개체와 관련된 약간의 추가 비용이 발생하여 사용할 이유가 생길 수 있습니다 Collections.emptyList. 내가 사용하는 같은 emptyList더 읽기 때문에 단지.


답변

그래도 조심하십시오. 당신이 돌아 오면 Collections.emptyList()한 후이 좋아하는 몇 가지 변경을하려고 add()하거나 그런 떨어지게, U는 것 UnsupportedOperationException()때문에 Collections.emptyList()돌아 불변의 객체를.


답변

나는 함께 갈 것 Collections.emptyList()그렇지 않으면 내가 옵션 2로 갈 것, 반환 된리스트 (목록은 불변으로) 어떤 식 으로든 수정되지 않을 경우.

이점은 Collections.emptyList()매번 동일한 정적 인스턴스가 리턴되므로 각 호출에 대해 인스턴스 작성이 발생하지 않는다는 것입니다.


답변

리턴 된 목록이 수정되지 않도록하려면 Collections.emptyList ()를 사용하십시오. 이것은 emptyList ()를 호출 할 때 반환되는 것입니다.

/**
 * The empty list (immutable).
 */
public static final List EMPTY_LIST = new EmptyList();


답변

주어진 답변은 불변성을 emptyList()반환 List하지만 대안을 제공하지 않는다는 사실을 강조합니다 . 생성자 ArrayList(int initialCapacity)특수 사례 0이므로 new ArrayList<>(0)대신 반환 new ArrayList<>()하는 것이 가능한 솔루션 일 수 있습니다.

/**
 * Shared empty array instance used for empty instances.
 */
private static final Object[] EMPTY_ELEMENTDATA = {};

[…]

/**
 * Constructs an empty list with the specified initial capacity.
 *
 * @param  initialCapacity  the initial capacity of the list
 * @throws IllegalArgumentException if the specified initial capacity
 *         is negative
 */
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

(Java 1.8.0_72의 소스)