天天看點

Effective Java 學習筆記——第六章(未完待續)

第30條 用enum代替int常量

1. enum與int枚舉對比

古老的int枚舉:

public static final int APPLE_FUJI = 0;  
public static final int APPLE_PIPPIN = 0;  
public static final int APPLE_GRANNY_SMITH = 0;  

public static final int ORANGE_FUJI = 0;  
public static final int ORANGE_PIPPIN = 0;  
public static final int ORANGE_GRANNY_SMITH = 0;  
           

enum枚舉:

public enum Apple{FUJI,PIPPIN,GRANNY_SMITH};
public enum Orange{FUJI,PIPPIN,GRANNY_SMITH};
           

enum枚舉較之于int枚舉的優勢:

  1. 語義化,簡潔
  2. 類型安全(當需要傳入Apple類型時,enum可以在編譯時期檢查是否傳的正确,而int枚舉不可以)
  3. enum可以有自己的方法與構造器(構造器私有),更加靈活,功能更強大

2. enum枚舉的特點

  1. 每個枚舉常量相當于有static final修飾;
  2. 枚舉類的構造器為private,外界無法建立其執行個體(但可以調用其内部唯一常量,作為單例模式);
  3. 編譯時期類型安全

3. enum枚舉執行個體

public enum EnumTest {
    RED("red", 1), GREEN("green", 2), BLUE("blue", 3);

    private String name;
    private int num;

    EnumTest(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public int getNum() {
        return num;
    }
}
           

4. 特定于常量的方法實作(即對方法枚舉)

public enum Operation{
    PLUS{double apply(double x,double y) {return x+y;}},
    MINUS{double apply(double x,double y) {return x-y;}};

    abstract double apply(double x,double y);
}
實質是對方法的枚舉,使用時為Operation.PLUS.apply(x,y)。注意enum的字首仍為static final。
每個枚舉常量都要繼承apply抽象方法。
           

第31條 用執行個體域代替序數

每個枚舉常量在枚舉表中的位置可用ordinal()函數擷取。但不建議使用該方法,因為一旦枚舉常量在枚舉表中的位置改變,ordinal()擷取的位置也會發生改變(除非你是真的隻想擷取它的位置)。

建議使用如

public enum Test{
    A(1),B(2); 
    private int location;
    Test(int location){
        this.location=location;
    }
    public int getLocation(){
        return location;
    }
}
           

便于以後的修改與擴充。

繼續閱讀