Effective Java读书笔记二:枚举和注解

第30条:用enum代替int常量

当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外。

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

枚举的ordinal()方法会返回枚举常量在类型中的数字位置, 但是尽量不要使用它,因为当重新排序后,会对客户端造成破坏。 正确的做法是,将他保存在一个实例域中。

应该给enum添加int域,而不是使用ordinal方法来导出与枚举关联的序数值。(几乎不应使用ordinal方法,除非在编写像EnumMap这样的基于枚举的通用数据结构)

//WRONG
public enum Fruit{
    APPLE, PEAR, ORANGE;
    public int numberOfFruit(){
        return ordinal() + 1;
   }
}

//RIGHT
public enum Fruit{
    APPLE(1), PEAR(2), ORANGE(3);
    private final int number;
    Fruit(int num) {number  = num;}
    public int numberOfFruit(){
        return number;
    }
}
 
 
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

第32条:用EnumSet代替位域

每个EnumSet的内容都表示为位矢量。如若底层的枚举类型个数小于64个,则整个EnumSet就用单个long来表示,因此性能上比的上位域。

//WRONG
public class Text{
    private static final int STYLE_BOLD                  = 1 << 0;
    private static final int STYLE_ITALIC                 = 1 << 1;
    private static final int STYLE_UNDERLINE         = 1 << 2;

    public void applyStyles(int styles) {...}
}
//use
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

//RIGHT
public class Text{
    public enum Style{STYLE_BOLD, STYLE_ITALIC, STYLE_UNDERLINE}

    public void applyStyles(Set