还有诸如emptyMap等都无法添加元素,那这些静态方法的作用是什么?
当你只需要一个不变的空列表的时候就用得到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一个ArrayList
或LinkedList
相比,可以节省不必要的空间。
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
3 回答1.9k 阅读
2 回答773 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.3k 阅读
首先, 遇到api问题请先查看api文档:
这些方法我个人通常是这样用的:
比如有一个方法是执行一些逻辑返回一个list, 比如查询数据库返回查询结果. 那么当没有任何东西时, 有两个选择: 返回null, 或者返回emptyList. 如果直接返回null, 那么调用方就需要判空, 而返回emptyList, 调用方可以直接操作.
这些方法就是"空对象设计模式"的一种实现. 和java 8引入的 Optional 比较像.