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ù)組,表示一座花園中的植物,你想要按照類型(一年生、多年生或者兩年生植物)進行組織之后再將這些植物列出來。如果要這么做的話,需要構(gòu)建三個集合,每種類型一個,并且遍歷整座花園,將每種香草放到相應(yīng)的集合中。有些程序員會將這些集合放到一個按照類型的序數(shù)進行索引的數(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ù)組不能與泛型兼容。程序需要進行未受檢的轉(zhuǎn)換,并且不能正確無誤地進行編譯。因為數(shù)組不知道它的索引代表著什么,你必須手工標注這些索引的輸出。但是這種方法最嚴重的問題在于,當你訪問一個按照枚舉的序數(shù)進行索引的數(shù)組時,使用正確的int值就是你的職責了;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)換;不必手工標注出這些索引的輸出,因為映射鍵知道如何將自身翻譯成可打印的字符串的枚舉;計算數(shù)組索引時也不可能出錯。EnumMap在運行速度方面之所以能與通過序數(shù)索引的數(shù)組相媲美,是因為EnumMap在內(nèi)部使用了這種數(shù)組。但是它對程序員隱藏了這種思想細節(jié),集Map的豐富功能和類型安全與數(shù)組的快速于一身。注意EnumMap構(gòu)造器采用鍵類型的Class對象:這是一個有限制的類型令牌(bounded type token),它提供了運行時的泛型信息。
總結(jié)
以上就是本文關(guān)于Java中EnumMap代替序數(shù)索引代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
bootstrap.yml如何讀取nacos配置中心的配置文件
這篇文章主要介紹了bootstrap.yml讀取nacos配置中心的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

