Collections.emptyList 无法add?

还有诸如emptyMap等都无法添加元素,那这些静态方法的作用是什么?

阅读 6.1k
2 个回答

首先, 遇到api问题请先查看api文档:

clipboard.png
clipboard.png

这些方法我个人通常是这样用的:
比如有一个方法是执行一些逻辑返回一个list, 比如查询数据库返回查询结果. 那么当没有任何东西时, 有两个选择: 返回null, 或者返回emptyList. 如果直接返回null, 那么调用方就需要判空, 而返回emptyList, 调用方可以直接操作.

这些方法就是"空对象设计模式"的一种实现. 和java 8引入的 Optional 比较像.

当你只需要一个不变的空列表的时候就用得到empytList啊,emptyMap同理。还有一点可以看一下源码:

private static class EmptyList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable {
    private static final long serialVersionUID = 8842843931221139166L;

    public Iterator<E> iterator() {
        return emptyIterator();
    }
    public ListIterator<E> listIterator() {
        return emptyListIterator();
    }

    public int size() {return 0;}
    public boolean isEmpty() {return true;}

    public boolean contains(Object obj) {return false;}
    public boolean containsAll(Collection<?> c) { return c.isEmpty(); }

    public Object[] toArray() { return new Object[0]; }

    public <T> T[] toArray(T[] a) {
        if (a.length > 0)
            a[0] = null;
        return a;
    }

    public E get(int index) {
        throw new IndexOutOfBoundsException("Index: "+index);
    }

    public boolean equals(Object o) {
        return (o instanceof List) && ((List<?>)o).isEmpty();
    }

    public int hashCode() { return 1; }

    @Override
    public boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        return false;
    }
    @Override
    public void replaceAll(UnaryOperator<E> operator) {
        Objects.requireNonNull(operator);
    }
    @Override
    public void sort(Comparator<? super E> c) {
    }

    // Override default methods in Collection
    @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
    }

    @Override
    public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }

    // Preserves singleton property
    private Object readResolve() {
        return EMPTY_LIST;
    }
}

EmptyList里面没有用来描述列表信息及保存列表元素的成员变量,获取EmptyList对象与直接new一个ArrayListLinkedList相比,可以节省不必要的空间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题