您好,登錄后才能下訂單哦!
1 枚舉提供了類型安全檢測
2 枚舉隔離了使用的類和枚舉類型,使增加和重排無需重新編譯
3 本質(zhì)上是單元素枚舉,final類型,不支持?jǐn)U展(繼承),但是可以自由使用接口和方法。
4 便于理解,維護(hù)
5 絕對安全的單例類型(相對于雙重鎖,無法被反序列化創(chuàng)造多個(gè)實(shí)例)
1 手機(jī)內(nèi)存資源有限,ENUM將會(huì)增大最終的DEX文件,大約是Integer常量的13倍,大量使用會(huì)影響程序性能。
2 虛擬機(jī)加載枚舉類,并且實(shí)例化所有的枚舉項(xiàng),并且這些枚舉實(shí)例的內(nèi)存無法回收,而且枚舉是單例,如果自定義的枚舉類中包含了大塊內(nèi)存的引用,也可能會(huì)帶來內(nèi)存泄露。
永遠(yuǎn)不要根據(jù)枚舉的序數(shù)導(dǎo)出與它關(guān)聯(lián)的值(ordinal()方法雖然從0開始,但是當(dāng)常量重排序時(shí)會(huì)混亂),而是要將它保存在一個(gè)實(shí)例域中:
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
private final int numberOfMusicians;
Ensemble(int size ) { this.numberOfMusicians = size; }
public int numberOfMusicians() { return numberOfMusicians;}
}
位域:text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
位域表示的缺陷:位域以數(shù)字形式打印時(shí),翻譯位域比翻譯簡單的int枚舉常量要困難得多;要遍歷位域表示的所有元素也沒有很容易的方法。
EnumSet:
public class Text {
public enum Style {BOLD , ITALIC , UNDERLINE , STRIKETHROUGH}
// Any Set could be passed in , but EnumSet is clearly best
public void applyStyles(Set<Style> styles) { ... }
}
使用:text.applyStyles(EnumSet.of(Style.BOLD , Style.ITALIC));
EnumSet缺點(diǎn):即截止Java 1.6發(fā)行版本,他都無法創(chuàng)建不可變的EnumSet,但是這一點(diǎn)很可能在即將出現(xiàn)的版本中得到修正。同時(shí),可以用Collections.unmodifiableSet將EnumSet封裝起來,但是間接性和性能會(huì)受到影響。
EnumMap優(yōu)點(diǎn):
1 結(jié)構(gòu)清晰,如果用索引,無法知道索引與對應(yīng)集合的關(guān)系)
2 安全,相對于索引作為key,當(dāng)修改對應(yīng)集合時(shí),如果未修改索引可能引發(fā)重大問題。
示例:
public enum Phase {
SOLID, LIQUID, GAS;
public enum Transition {
MELT(SOLID,LIQUID), FREEZE(LIQUID, SOLID),
BOIL(LIQUID, GAS), CONDENSE(GAS, LIQUID),
SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
private final Phase src;
private final Phase dst;
Transition(Phase src, Phase dst) {
this.src = src;
this.dst = dst;
}
private static final Map<Phase, Map<Phase, Transition>> m =
new EnumMap<Phase, Map<Phase, Transition>>(Phase.class);
static {
for(Phase p : Phase.values())
m.put(p, new EnumMap<Phase, Transition>(Phase.class));
for(Transition t : Transition.values())
m.get(t.src).put(t.dst, t);
}
public static Transition from(Phase src, Phase dst) {
return m.get(src).get(dst);
}
}
}
枚舉為final,無法通過繼承擴(kuò)展,但可以使用接口方式擴(kuò)展
public interface Operation {
double apply(double x,double y);
}
public enum BasicOperation implements Operation {
PLUS("+"){
public double apply(double x, double y) {
return x + y;
}
},
MINUS("-"){
public double apply(double x, double y) {
return x - y;
}
};
private final String symbol;
BasicOperation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString(){
return symbol;
}
}
public enum ExtendedOperation implements Operation{
Exp("^"){
public double apply(double x,double y){
//次冪計(jì)算
return Math.pow(x, y);
}
},
REMAINDER("%"){
public double apply(double x,double y){
return x % y;
}
};
private final String symbol;
ExtendedOperation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString(){
return symbol;
}
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。