실제로, 더 나은처럼 빈 목록을 반환하는 이 :
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의 소스)