建議 用EnumMap代替序數索引。

2021-08-21 06:13:31 字數 1281 閱讀 6295

enummap在執行速度方面之所以能與通過序數索引的陣列相媲美,是因為enummap在內部使用了這種陣列。但是他對程式設計師隱藏了這種實現細節,集map的豐富功能和型別安全與陣列的快速於一身。注意enummap構造器採用鍵型別的class物件:這是乙個有限制的型別令牌(bounded type token),他提供了執行時的泛型資訊。

下面這個程式就是使用乙個陣列將兩個階段對映到乙個階段過渡中(從液體到固體稱作凝固,從液體到氣體稱作沸騰,諸如此類)。

**示例:

public enum phase 

private static final map> m = new enummap>(

phase.class);

static

for (transition trans : transition.values())

}public static transition from(phase _src, phase _dst)

}}

初始化階段過渡map的**看起來可能有點複雜,但是還不算太糟糕。map的型別為map>,表示是由鍵為源phase(即第乙個phase)、值為另乙個map組成的map,其中組成值的map是由鍵值對目標phase(即第二個phase)、transition組成的。靜態初始化**塊中的第乙個迴圈塊中的第乙個迴圈初始化了外部map,得到了三個空的內容map。**塊中的第二個迴圈利用每個狀態過渡常量提供的起始資訊和目標資訊初始化了內部map。

現在假設想要給系統新增乙個新的階段:plasma(離子)或者電離氣體。只有兩個過渡與這個階段關聯:電離化,他將氣體變成離子;以及消電離化,將例子變成氣體。為了更新基於陣列的程式,必須給phase新增一種新常量,給phase.transition新增兩種新常量,用一種新的16個元素的版本取待原來9個元素的陣列的陣列。如果給陣列新增的元素過多或者過少,或者元素放置不妥當,可就麻煩了:程式可以編譯,但是會在執行時失敗。為了更新基於enummap的版本,所要做的是就是必須將plasma新增到phase列表,並將ionize(gas,plasma)和deionize(plasma,gas)新增到phase.transition的列表中。程式會自行處理所有其他的事情,你幾乎沒有機會出錯。從內部來看,map的map被實現成了陣列的陣列,因此在提公升了清楚性、安全性和易維護性的同時,在空間或者時間上還幾乎不用任何開銷。

總而言之,最好不要用序數來索引陣列,而要使用enummap。如果你所表示的這種關係是多維的,就使用enummap<..., enummap<...>>。應用程式的程式設計師在一般情況下都不使用enum.ordinal,即使要用也很少,因此這是一種特殊情況。

建議110 用類來代替enum

建議110 用類來代替enum 列舉 enum 用來表示一組固定的值。例如,為了表示星期資訊,我們可以定義列舉week enum week 列舉最大的優點在於它的型別是值型別。相比較引用型別來說,它可以在關鍵演算法中提公升效能,因為它不需要建立在 堆 中。但是,如果不考慮這方面的因素,我們不妨讓類 ...

建議104 用多型代替條件語句

假設開發自動駕駛系統。在設計之初,自動駕駛系統擁有乙個駕駛系統命令的列舉型別 enum drivecommand start,stop 又假設有乙個駕駛的方法處理車輛接收到的指令。一開始我們這樣編碼 static void main string args drivecommand comand d...

用迴圈代替游標

在sql的sp開發中,游標有不可或缺的作用。但是,一些不當的使用游標,會造成嚴重系統效能的下降,所有呢,很多的人就想找乙個方法,即能達到游標的功能,又對效能影響小一些。這就是本文要講的用迴圈代替游標。一般情況下,用光標的目的就是要達到乙個迴圈,可是我們要是以迴圈來作呢,如何來控制當前的變數值就是關鍵...