91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Collections.emptyList()的注意事項是什么

發布時間:2021-03-29 10:43:04 來源:億速云 閱讀:209 作者:小新 欄目:開發技術

小編給大家分享一下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()的注意事項是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙岩市| 靖远县| 灵台县| 图木舒克市| 沁源县| 泰顺县| 焦作市| 泰宁县| 建宁县| 郎溪县| 龙游县| 南木林县| 棋牌| 郓城县| 道真| 许昌市| 承德市| 鹤庆县| 涡阳县| 玉林市| 称多县| 饶河县| 汶上县| 莎车县| 石柱| 长阳| 澄城县| 南部县| 襄樊市| 壶关县| 靖边县| 炉霍县| 缙云县| 彭阳县| 正定县| 绥阳县| 商水县| 昌图县| 德令哈市| 信阳市| 锡林郭勒盟|