個(gè)人讀書筆記,部分沒讀懂的知識(shí)點(diǎn)可能會(huì)簡單概括或缺失,以后反復(fù)閱讀后再完善。
第6章 枚舉和注解
第30條:用enum代替int常量
int枚舉模式:
public static final int APPLE_FUJI=0;
public static final int APPLE_PIPPIN=1;
public static final int APPLE_GRANNY_SMITH=2;
int枚舉模式如果與枚舉常量關(guān)聯(lián)的int發(fā)生了變化,客戶端就必須重新編譯。
枚舉類型:
public enum Apple{FUJI,PIPPIN,GRANNY_SMITH}
第31條: 用實(shí)例域代替序數(shù)
ordinal方法返回每個(gè)枚舉常量在類型中的數(shù)字位置。
public enum Ensemble{
SOLO,DUET,TRIO,QUARTET,QUINTET,
SEXTET,SEPTET,OCTET,NONET,DECTET;
public int numberOfMusicians() { return ordinal()+1; }
}
但最好用這種寫法:
public enum Ensemble{
SOLO(1),DUET(2),TRIO(3),QUARTET(4),QUINTET(5),
SEXTET(6),SEPTET(7),OCTET(8),NONET(9),DECTET(10),
TRIPLE_QUARTET(12);
private final int numberOfMusicians;
Ensemble(int size) {
this.numberOfMusicians = size;
}
public int numberOfMusicians() { return numberOfMusicians; }
}
第31條: 用EnumSet代替位域
int枚舉模式:
public class Text {
public static final int STYLE_BOLD=1<<0;
public static final int STYLE_ITALIC=1<<1;
public static final int STYLE_UNDERLINE=1<<2;
public static final int STYLE_STRIKETHROUGH=1<<3;
public void applyStyles(int styles) {
}
}
這種表示法讓你用OR運(yùn)算符將幾個(gè)常量合并到一個(gè)集合中,稱作位域:
text.applyStyles(STYLE_BOLD|STYLE_ITALIC);
用枚舉代替位域后的代碼:
public class Text {
public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
public void applyStyles(Set<Style> styles) {
}
}
客戶端代碼:
text.applyStyles(EnumSet.of(Text.Style.BOLD, Text.Style.UNDERLINE));
正是因?yàn)槊杜e類型要用在集合中,所以沒有理由用位域來表示它。
第33條: 用EnumMap代替序數(shù)索引
第34條: 用接口模擬可伸縮的枚舉
雖然無法編寫可擴(kuò)展的枚舉類型,卻可以通過編寫接口以及實(shí)現(xiàn)接口的基礎(chǔ)枚舉類型。