天天看点

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;
    }
}
           

便于以后的修改与扩展。

继续阅读