第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枚举的优势:
- 语义化,简洁
- 类型安全(当需要传入Apple类型时,enum可以在编译时期检查是否传的正确,而int枚举不可以)
- enum可以有自己的方法与构造器(构造器私有),更加灵活,功能更强大
2. enum枚举的特点
- 每个枚举常量相当于有static final修饰;
- 枚举类的构造器为private,外界无法创建其实例(但可以调用其内部唯一常量,作为单例模式);
- 编译时期类型安全
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;
}
}
便于以后的修改与扩展。