Java中Collections.emptyList()的注意事项

偶然发现有小伙伴错误地使用了Collections.emptyList()方法,这里记录一下。她的使用方式是:

public void run() {
  ......
  List list = buildList(param);
  ......
  Object newNode = getNode(...);
  list.add(newNode);
  ......
}

public List buildList(Object param) {
  if (isInValid(param)) {
    return Collections.emptyList();
  } else {
    ......
  }
}

buildList方法中可能会返回一个"空的List",后续还可能往这个List添加元素(或者移除元素),但是没有注意Collections.emptyList方法返回的是一个EMPTY_LIST:

public static final <T> List<T> emptyList() {
  return (List<T>) EMPTY_LIST;
}

它是一个static final修饰的成员变量,是一个EmptyList类的实例:

public static final List EMPTY_LIST = new EmptyList<>();

这个EmptyList是一个静态内部类,和ArrayList一样继承自AbstractList:

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; }

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

可以看到这个EmptList没有重写add方法,并且get方法也是直接抛出一个IndexOutOfBoundsException异常。既然没有重写add方法,那么看看父类AbstractList中的add方法:

public boolean add(E e) {
  add(size(), e);
  return true;
}

public void add(int index, E element) {
  throw new UnsupportedOperationException();
}

可以看到直接抛出的UnsupportedOperationException异常。再回到EmptyList类中,它对外提供的一些方法也很明显地限制了它的使用范围。

对于Collections.emptyList(),或者说Collections.EMPTY_LIST,最好只把它当做一个空列表的标识(可以想象成一个frozen过的空List),不要对其做一些增删改查的操作。如果程序中的一些分支逻辑返回了这种实例,测试的时候又没有覆盖到,在生产环境如果走到了这个分支逻辑,那就麻烦了~

总结

到此这篇关于Java中Collections.emptyList()注意事项的文章就介绍到这了,更多相关Java Collections.emptyList()注意内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中Collections.emptyList()的注意事项

    偶然发现有小伙伴错误地使用了Collections.emptyList()方法,这里记录一下.她的使用方式是: public void run() { ...... List list = buildList(param); ...... Object newNode = getNode(...); list.add(newNode); ...... } public List buildList(Object param) { if (isInValid(param)) { return Co

  • 详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 浅谈Java中Collections.sort对List排序的两种方法

    目录 一.Collections.sort的简单使用 二.问题提出 三.Comparable实现排序 四.Comparator实现排序 五.Comparable 与Comparator区别 一.Collections.sort的简单使用 说到List的排序,第一反应当然是使用Collections.sort,方便简单.下面实现一下~~ private void sortStrings() { List<String> list = new ArrayList<String>();

  • java中Collections.sort排序函数用法详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • Java中包装类介绍与其注意事项

    前言 大家都知道在Java中,除了8种基本数据类型外,其他的都是引用类型.使用引用类型是为了更好地贯彻面向对象的思想,那为什么还要保留8种基本数据类型呢? 这其实更多地是照顾程序员的习惯.为了既照顾程序员的习惯,同时又能全面贯彻面向对象编程的思想,Java中引入了包装类机制. 所谓的包装类就是为8种基本数据类型分别定义了相应的引用类型,其对应关系如下: 显然,除了int及char外,其余的包装类都是将对应的基本数据类型的首字母大写即可. 那为什么要引入包装类呢?前面已经说过,是为了全面贯彻面向对

  • JAVA中Collections工具类sort()排序方法

    本问介绍了Collections工具类两种sort()方法,具体如下: 一.Collections工具类两种sort()方法 格式一: public static <T extends Comparable<? super T>> void sort(List<T> list) 说明:该方法中的泛型<T>都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序.如果其他类型的数据要进行比较排序,必须继承Compar

  • java.util.Collections类—emptyList()方法的使用

    目录 emptyList()方法的使用 Java Collections.emptyList()方法的注意事项 emptyList() Collections是列表的工具类,其中有好多方便实用的方法.主要是对列表的查找.替换.排序.反转等操作.今天介绍一下emptyList()方法的使用,因为这个方法有一个大坑! emptyList()方法的使用 通过java.util.Collections.emptyList()方法的相关源码可以得知它实际上就是返回了一个空的List,但是这个List和我们

  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    前言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal ,关于BigDecimal 的介绍

  • Java使用Collections.sort()排序的示例详解

    Java中Collections.sort()排序详解,通过实例代码给大家讲解,具体代码如下所示: public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("beijing"); list.add("shanghai"); list.add("hangzhou"); Collections.

随机推荐