最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中EnumMap代替序數(shù)索引代碼詳解

 更新時間:2018年02月01日 10:00:28   作者:司馬懿字仲達(dá)  
這篇文章主要介紹了Java中EnumMap代替序數(shù)索引代碼詳解,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Java中EnumMap代替序數(shù)索引的相關(guān)內(nèi)容,具體介紹如下。

學(xué)習(xí)筆記《Effective Java 中文版 第2版》

經(jīng)常會碰到使用Enum的ordinal方法來索引枚舉類型。

public class Herb {
  public enum Type { ANNUAL, PERENNIAL, BIENNIAL };
  private final String name;
  private final Type type;

  Herb(String name, Type type) {
    this.name = name;
    this.type = type;
  }

  @Override public String toString() {
    return name;
  }
}

現(xiàn)在假設(shè)有一個香草的數(shù)組,表示一座花園中的植物,你想要按照類型(一年生、多年生或者兩年生植物)進(jìn)行組織之后再將這些植物列出來。如果要這么做的話,需要構(gòu)建三個集合,每種類型一個,并且遍歷整座花園,將每種香草放到相應(yīng)的集合中。有些程序員會將這些集合放到一個按照類型的序數(shù)進(jìn)行索引的數(shù)組來實現(xiàn)這一點。

//Using ordinal() to index an array - DON'T DO THIS
Herb[] garden = ... ;

//Indexed by Herb.Type.ordinal()
Set<Herb>[] herbsByType = (Set<Herb>[])new Set[Herb.Type.values().length]; 
for(int i=0; i<herbsByType.length; i++) {
  herbsByType[i] = new HashSet<Herb>();
}

for(Herb h : garden) {
  herbsByType[h.type.ordinal()].add(h);
}

//Print the results
for(int i=0; i<herbsByType.length; i++) {
  System.out.printf("%s: %s%n", Herb.Type.values()[i], herbsByType[i]);
}

這種方法的確可行,但是隱藏著許多問題。因為數(shù)組不能與泛型兼容。程序需要進(jìn)行未受檢的轉(zhuǎn)換,并且不能正確無誤地進(jìn)行編譯。因為數(shù)組不知道它的索引代表著什么,你必須手工標(biāo)注這些索引的輸出。但是這種方法最嚴(yán)重的問題在于,當(dāng)你訪問一個按照枚舉的序數(shù)進(jìn)行索引的數(shù)組時,使用正確的int值就是你的職責(zé)了;int不能提供枚舉的類型安全。你如果使用了錯誤的值,程序就會悄然地完成錯誤的工作,或者幸運的話就會拋出ArrayIndexOutOfBoundException異常。

java.util.EnumMap是一種非??焖俚腗ap實現(xiàn)專門用于枚舉的鍵。

//Using an EnumMap to associate data with an enum
Map<Herb.Type, Set<Herb>> herbsByType = new EnumMap<Herb.Type, 
Set<Herb>>(Herb.Type.class);

for(Herb.Type t : Herb.Type.values)
  herbsByType.put(t, new HashSet<Herb>());

for(Herb h : garden)
  herbsByType.get(h.type).add(h);

System.out.println(herbsByType);

這段程序更簡短,更清楚,也更安全,運行速度方面可以與使用序數(shù)的程序相媲美。它沒有不安全的轉(zhuǎn)換;不必手工標(biāo)注出這些索引的輸出,因為映射鍵知道如何將自身翻譯成可打印的字符串的枚舉;計算數(shù)組索引時也不可能出錯。EnumMap在運行速度方面之所以能與通過序數(shù)索引的數(shù)組相媲美,是因為EnumMap在內(nèi)部使用了這種數(shù)組。但是它對程序員隱藏了這種思想細(xì)節(jié),集Map的豐富功能和類型安全與數(shù)組的快速于一身。注意EnumMap構(gòu)造器采用鍵類型的Class對象:這是一個有限制的類型令牌(bounded type token),它提供了運行時的泛型信息。

總結(jié)

以上就是本文關(guān)于Java中EnumMap代替序數(shù)索引代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 詳解java動態(tài)代理模式

    詳解java動態(tài)代理模式

    這篇文章主要為大家詳細(xì)介紹了java動態(tài)代理模式,總結(jié)一下代理模式,以及jdk,cglib代理模式用法,來理解代理模式,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot中JPA更新時部分字段無效

    SpringBoot中JPA更新時部分字段無效

    本文主要介紹了SpringBoot中JPA更新時部分字段無效,在通過注解自動更新時,部分字段在調(diào)試時可以找到,卻沒有被自動更新到數(shù)據(jù)庫中,下面就介紹一下解決方法
    2023-04-04
  • java使用鏈表實現(xiàn)約瑟夫環(huán)

    java使用鏈表實現(xiàn)約瑟夫環(huán)

    這篇文章主要為大家詳細(xì)介紹了java使用鏈表實現(xiàn)約瑟夫環(huán),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • bootstrap.yml如何讀取nacos配置中心的配置文件

    bootstrap.yml如何讀取nacos配置中心的配置文件

    這篇文章主要介紹了bootstrap.yml讀取nacos配置中心的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 解析Java異步之call future

    解析Java異步之call future

    當(dāng)調(diào)用一個函數(shù)的時候,如果這個函數(shù)的執(zhí)行過程是很耗時的,就必須要等待,但是有時候并不急著要這個函數(shù)返回的結(jié)果。因此,可以讓被調(diào)者立即返回,讓他在后臺慢慢處理這個請求。對于調(diào)用者來說,可以先處理一些其他事情,在真正需要數(shù)據(jù)的時候再去嘗試獲得需要的數(shù)據(jù)
    2021-06-06
  • java實現(xiàn)短信通信的完整教程

    java實現(xiàn)短信通信的完整教程

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)短信通信的完整教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進(jìn)先出”?的原則.阻塞隊列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu)。本文將通過一些示例為大家詳細(xì)講講阻塞隊列的原理與使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-10-10
  • Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Apache的Groovy是Java平臺上設(shè)計的面向?qū)ο缶幊陶Z言,這門動態(tài)語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺的腳本語言使用,這篇文章主要介紹了Java?熱更新?Groovy?實踐及踩坑指南,需要的朋友可以參考下
    2022-09-09
  • 基于maven中多個子模塊的構(gòu)建順序

    基于maven中多個子模塊的構(gòu)建順序

    這篇文章主要介紹了maven中多個子模塊的構(gòu)建順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

陇西县| 安康市| 五莲县| 盐源县| 八宿县| 宁化县| 凤翔县| 新巴尔虎左旗| 铅山县| 罗平县| 三江| 新宁县| 德令哈市| 青田县| 南昌县| 汽车| 怀安县| 兴和县| 宁化县| 嫩江县| 青冈县| 吉林市| 福建省| 青浦区| 阿坝| 沙洋县| 富宁县| 内黄县| 祥云县| 山东省| 鄂尔多斯市| 大丰市| 平乡县| 潞西市| 如皋市| 德昌县| 嘉兴市| 平武县| 方城县| 峡江县| 海门市|