В этой серии статей я сравниваю разные способы написания кода одной и той же функциональности. В последнем сообщении сравнивались Collections.singletonList и ArrayList для создания списка из одного элемента.
В этом посте я сравню Collections.singletonList с другим известным фабричным методом List.of.
public static
public static void main(String[] args) { final var addresses = Collections.singletonList( new Address( "742 Evergreen Terrace", "Springfield", "New York", "13468", "US" )); System.out.println(addresses); }
Этот метод возвращает неизменяемый список, содержащий только указанный объект. Он был представлен в Java 1.3. Преимущества по сравнению с ArrayList были описаны в предыдущем посте, но резюмируем:
статический
public static void main(String[] args) { final var addresses2 = List.of( new Address( "1007 Mountain Drive", "Bristol Township", "New Jersey", null, "US" )); System.out.println(addresses2); }
Метод List.of(E e) также является фабричным методом, который возвращает неизменяемый список. В отличие от Collections.singletonList(E e), который поддерживает только один элемент, List.of поддерживает от 0 до 10 элементов, а также массивы с несколькими элементами. Он был представлен в Java 9, через 17 лет после SingletonList.
Интересно отметить, что в отличие от SingletonList, у которого есть комментарий:
Возвращает неизменяемый список, содержащий только указанный объект.
В Array.of указано, что это Неизменяемый список:
Возвращает неизменяемый список, содержащий один элемент.
Это отражает новое понимание неизменности коллекций. Согласно этой документации:
Коллекция считается неизменяемой, если элементы нельзя добавлять, удалять или заменять. Однако неизменяемая коллекция является неизменяемой только в том случае, если элементы, содержащиеся в коллекции, являются неизменяемыми.
Несмотря на различия в терминологии, оба фабричных метода имеют практически одинаковую функциональность. Заглянув глубже в UnmodifyingList, мы можем найти:
staticList of(E e1) { return new ImmutableCollections.List12(e1); }
Какой сюрприз, они использовали не очень точный термин Неизменяемый, однако!
static final class List12extends AbstractImmutableList implements Serializable { @Stable private final E e0; @Stable private final E e1; List12(E e0) { this.e0 = Objects.requireNonNull(e0); this.e1 = null; } ... }
static abstract class AbstractImmutableListextends AbstractImmutableCollection implements List , RandomAccess { // all mutating methods throw UnsupportedOperationException @Override public void add(int index, E element) { throw uoe(); } @Override public boolean addAll(int index, Collection extends E> c) { throw uoe(); } @Override public E remove(int index) { throw uoe(); } @Override public void replaceAll(UnaryOperator operator) { throw uoe(); } @Override public E set(int index, E element) { throw uoe(); } @Override public void sort(Comparator super E> c) { throw uoe(); }
Единственное отличие состоит в том, что List12 имеет два поля для потенциально двух элементов, что также приводит к незначительному использованию памяти, если только речь не идет о больших объектах.
На этот раз мы сравнили фабричные методы Collections.singletonList и List.of, чтобы создать список из одного элемента. Мы обсудили семантику неизменяемого и неизменяемого и показали, что оба метода эффективны, лаконичны и не требуют больших ресурсов. Если вы можете использовать более позднюю версию Java, она предпочтительнее из-за ее привычности, ясности и потому, что мы используем интерфейс списка гораздо чаще, чем интерфейс коллекций. Если использовать более старую версию Java, Collections.singletonList остается надежным выбором.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3