Effective Java读书笔记--第6章 枚举和注解

个人读书笔记,部分没读懂的知识点可能会简单概括或缺失,以后反复阅读后再完善。

第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枚举模式如果与枚举常量关联的int发生了变化,客户端就必须重新编译。

枚举类型:

public enum Apple{FUJI,PIPPIN,GRANNY_SMITH}

第31条: 用实例域代替序数

ordinal方法返回每个枚举常量在类型中的数字位置。

    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运算符将几个常量合并到一个集合中,称作位域

text.applyStyles(STYLE_BOLD|STYLE_ITALIC);

用枚举代替位域后的代码:

public class Text {
    public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}

    public void applyStyles(Set