На практике лучше вернуть пустой список, например this:
return Collections.emptyList();
Или как this:
return new ArrayList<Foo>();
Или это полностью зависит от того, что вы собираетесь делать с возвращенным списком?
На практике лучше вернуть пустой список, например this:
return Collections.emptyList();
Или как this:
return new ArrayList<Foo>();
Или это полностью зависит от того, что вы собираетесь делать с возвращенным списком?
Основное отличие состоит в том, что Collections.emptyList()
возвращает неизменный список, т.е. список, к которому вы не можете добавить элементы.
В редких случаях, когда вы хотите изменить возвращенный список, это, таким образом, не будет вариантом.
Я бы сказал, что возвращение неизменяемого списка прекрасно (и даже предпочтительный вариант), пока контракт (документация) явно не говорит иначе.
Кроме того, emptyList()
может не создавать новый объект с каждым вызовом.
Реализации этого метода не должны создавать отдельный объект List для каждого вызова. Использование этого метода, вероятно, будет иметь сопоставимые затраты на использование поля с похожими именами. (В отличие от этого метода, поле не обеспечивает безопасность типа.)
Реализация emptyList
выглядит следующим образом:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Итак, если ваш метод (который возвращает пустой список) вызывается очень часто, этот подход может даже дать вам немного лучшую производительность как процессора, так и памяти.
Начиная с Java 5.0 вы можете указать тип элемента в контейнере:
Collections.<Foo>emptyList()
Я согласен с другими ответами, что для случаев, когда вы хотите вернуть пустой список, который остается пустым, вы должны использовать этот подход.
Collections.emptyList
является неизменным, поэтому существует разница между двумя версиями, поэтому вы должны учитывать пользователей возвращаемого значения.
Возврат new ArrayList<Foo>
всегда создает новый экземпляр объекта, поэтому он имеет очень небольшую дополнительную стоимость, связанную с ним, что может дать вам основание использовать Collections.emptyList
. Мне нравится использовать emptyList
только потому, что это более читаемо.
Будьте осторожны, хотя. Если вы возвращаете Collections.emptyList()
и затем пытаетесь внести в него некоторые изменения, такие как add()
или что-то в этом роде, у вас будет 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)