欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

java.util.EnumMap是一種非??焖俚腗ap實(shí)現(xiàn)專門(mé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);

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

總結(jié)

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

相關(guān)文章

  • Java創(chuàng)建與結(jié)束線程代碼示例

    Java創(chuàng)建與結(jié)束線程代碼示例

    這篇文章主要介紹了Java創(chuàng)建與結(jié)束線程代碼示例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • Spring?refresh()源碼解析

    Spring?refresh()源碼解析

    這篇文章主要為大家介紹了Spring?refresh()源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 使用IDEA創(chuàng)建Servlet程序的詳細(xì)步驟

    使用IDEA創(chuàng)建Servlet程序的詳細(xì)步驟

    在學(xué)習(xí)servlet過(guò)程中,參考的教程是用eclipse完成的,而我在練習(xí)的過(guò)程中是使用IDEA的,在創(chuàng)建servlet程序時(shí)遇到了挺多困難,在此記錄一下如何用IDEA完整創(chuàng)建一個(gè)servlet程序,感興趣的朋友一起看看吧
    2024-08-08
  • Java設(shè)計(jì)模式之中介者模式(Mediator Pattern)簡(jiǎn)介

    Java設(shè)計(jì)模式之中介者模式(Mediator Pattern)簡(jiǎn)介

    這篇文章主要介紹了Java設(shè)計(jì)模式之中介者模式(Mediator Pattern),需要的朋友可以參考下
    2014-07-07
  • SpringBoot實(shí)現(xiàn)異步事件Event詳解

    SpringBoot實(shí)現(xiàn)異步事件Event詳解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽(tīng)器中執(zhí)行,因?yàn)楸O(jiān)聽(tīng)器中存在失敗的風(fēng)險(xiǎn),所以使用的時(shí)候需要注意,需要的朋友可以參考下
    2023-11-11
  • JDK完全卸載超詳細(xì)步驟

    JDK完全卸載超詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于JDK完全卸載超詳細(xì)步驟的相關(guān)資料,在安裝JDK之前,最好將原來(lái)可能安裝過(guò)的JDK卸載掉,以免影響到新JDK的使用,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)圖片驗(yàn)證碼功能

    Java實(shí)現(xiàn)圖片驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 聊聊maven的pom.xml中的exclusions標(biāo)簽的作用

    聊聊maven的pom.xml中的exclusions標(biāo)簽的作用

    這篇文章主要介紹了maven的pom.xml中的exclusions標(biāo)簽的作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java小數(shù)位的例子

    java小數(shù)位的例子

    在java中要保留數(shù)字小數(shù)位我們有常用的四種方法,分別為:四舍五入,DecimalFormat,format,String .format與struts標(biāo)簽操作實(shí)現(xiàn),下面給出例子
    2013-11-11
  • MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼

    MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼

    在MyBatis-Flex中實(shí)現(xiàn)分頁(yè)查詢時(shí),需要注意維護(hù)一個(gè)獲取數(shù)據(jù)庫(kù)總數(shù)的方法,詳細(xì)介紹了UserService、UserServiceImpl類以及Mapper.xml配置,感興趣的可以了解一下
    2024-10-10

最新評(píng)論