亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年03月28日 08:41:07   作者:黃智霖-blog  
這篇文章主要給大家介紹了關(guān)于Java中Collections.emptyList()的注意事項,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

偶然發(fā)現(xiàn)有小伙伴錯誤地使用了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",后續(xù)還可能往這個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是一個靜態(tài)內(nèi)部類,和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),不要對其做一些增刪改查的操作。如果程序中的一些分支邏輯返回了這種實例,測試的時候又沒有覆蓋到,在生產(chǎn)環(huán)境如果走到了這個分支邏輯,那就麻煩了~

總結(jié)

到此這篇關(guān)于Java中Collections.emptyList()注意事項的文章就介紹到這了,更多相關(guān)Java Collections.emptyList()注意內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Java中StringBuffer和StringBuilder的使用

    淺析Java中StringBuffer和StringBuilder的使用

    當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。本文就來和大家簡單聊聊這二者的使用與區(qū)別吧,希望對大家有所幫助
    2023-04-04
  • Java線程中斷機制interrupt、isInterrupted、interrupted方法詳解

    Java線程中斷機制interrupt、isInterrupted、interrupted方法詳解

    這篇文章主要介紹了Java線程中斷機制interrupt、isInterrupted、interrupted方法詳解,一個線程不應(yīng)該由其他線程來強制中斷或停止,而是應(yīng)該由線程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已經(jīng)被廢棄了,需要的朋友可以參考下
    2024-01-01
  • 通過實例了解java checked和unchecked異常

    通過實例了解java checked和unchecked異常

    這篇文章主要介紹了通過實例了解checked和unchecked異常,Java異常分為兩種類型,checked異常和unchecked異常,另一種叫法是異常和錯誤。下面小編就帶大家來一起學習一下吧
    2019-06-06
  • Maven設(shè)置JDK版本的兩種方法實現(xiàn)

    Maven設(shè)置JDK版本的兩種方法實現(xiàn)

    本文主要介紹了Maven設(shè)置JDK版本的兩種方法實現(xiàn),是通過Apache Maven Compiler Plugin插件實現(xiàn)的,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • win10設(shè)置java環(huán)境變量的方法

    win10設(shè)置java環(huán)境變量的方法

    下面小編就為大家?guī)硪黄獁in10設(shè)置java環(huán)境變量的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • springboot中使用@NotNull注解無效解決方法

    springboot中使用@NotNull注解無效解決方法

    這篇文章主要給大家介紹了關(guān)于springboot中使用@NotNull注解無效的解決方法,進行參數(shù)校驗的時候,加了@NotNull注解,@Validated注解和@Valid注解,但是參數(shù)校驗的時候不生效,需要的朋友可以參考下
    2023-08-08
  • Java模版引擎Freemarker

    Java模版引擎Freemarker

    FreeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫 FreeMarker被設(shè)計用來生成HTML Web頁面,特別是基于MVC模式的應(yīng)用程序
    2016-04-04
  • Java最簡潔數(shù)據(jù)結(jié)構(gòu)之冒泡排序快速理解

    Java最簡潔數(shù)據(jù)結(jié)構(gòu)之冒泡排序快速理解

    冒泡排序是編程中數(shù)據(jù)結(jié)構(gòu)繞不過的一個基礎(chǔ)點,有關(guān)于冒泡排序的文章也有很多,但可能會比較繚亂未能理解,本章將一子u為簡潔明了的例圖帶你通關(guān)冒泡排序
    2021-11-11
  • Java調(diào)用ChatGPT的實現(xiàn)代碼

    Java調(diào)用ChatGPT的實現(xiàn)代碼

    這篇文章主要介紹了Java調(diào)用ChatGPT的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • maven倉庫訪問順序小結(jié)

    maven倉庫訪問順序小結(jié)

    在日常操作中,相信很多人在maven倉庫的優(yōu)先級順序是什么問題上存在疑惑,本文就來介紹一下maven倉庫訪問順序,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論