学习一个东西是为了解决问题,而不是秀儿................
1 枚举帮我们解决什么问题
第一个功能:枚举帮我们定义状态
请看我们平时开发一定会有这么多的状态标志来用,但是这样用真的好吗?
所以用枚举代替int 常量!!!
//延时订单状态
public static final int ORDER_DEPOT_UNPAY = 0;
//public static final String ORDER_DEPOT_UNPAY_DESC = "unpay";
public static final int ORDER_DEPOT_PAID = 3;
public static final int ORDER_DEPOT_TIMOUT = 2;
//物流订单状态
public static final int ORDER_LOGISTICS_READY = 0;
public static final int ORDER_LOGISTICS_TRANSPORT = 1;
public static final int ORDER_LOGISTICS_ARRIVED = 2;
弊端: 1 使用起来不清晰 2 final 所修饰的成员变量,在编译成class 文件后编译器会直接把这些作为常量留在在前类的class文件中去,这就使得这个class变的臃肿。
臃肿的class 对于程序的效率显然必定会有问题。
解决办法,请看下面代码
public enum DepotEnum {
//下面的每个都是实例(构造方法),所以对应枚举的构造方法和这个是
UNPAY(0,"未支付"),PAID(1,"已支付"),TIMOUT(-1,"超时");
private String desc;
private int status;
private String dbInfo;//其他属性
private DepotEnum(int status,String desc ) {
this.status = status;
this.desc = desc;
}
public int getStatus() {
return status;
}
public String getDesc() {
return desc;
}
public String getDbInfo() {
return dbInfo;
}
public int calcStatus(int params) {
return status+params;
}
//调用方式
public static void main(String[] args) {
//从这两行代码中暗示了,在枚举中的枚举类型即 UNPAY(0,"未支付"),PAID(1,"已支付"),TIMOUT(-1,"超时");
// 他们三个枚举类型每个都是一个实例 (因为DepotEnum.valueOf("UNPAY"); 返回的是DepotEnum 类型的引用) 相当于每个都调用了有参构造方法 private DepotEnum(int status,String desc )
DepotEnum unpay = DepotEnum.valueOf("UNPAY");
System.out.println( unpay);
}
}
所以我们说枚举本质: 枚举类中的每个枚举类型都是 这个当下的枚举类的一个实例
第二个功能定义行为
public class ActiveEnum {
//第一种方式 ,枚举类型定义行为的方法,在少定义一个枚举行为情况下,没有提示报错,
public enum NormalActive{
// 加法 减法 城发 除法
PLUS,MINUS,MULTI,DIVIDS;
double oper(double x,double y) {
switch(this) {
case PLUS:return x+y;
case MINUS:return x-y;
case MULTI:return x*y;
//注意这里少写了一个 除法,编译器编译期间他不能有任何提示
}
throw new UnsupportedOperationException();
}
}
//第二种枚举类型定义行为的方式,可以要求每个枚举类型重写方法,这就避免上面的落下一个除法的行为代码的书写
public enum BetterActive{
//这里有个小技巧!!!!
//此抽象方法,对于每个枚举类型代表当前枚举类的实例,则必须重写oper 方法,可以提前报错要求开发人员来实现这个方法
abstract double oper(double x,double y);
PLUS {
@Override
double oper(double x, double y) {
return x+y;
}
},MINUS {
@Override
double oper(double x, double y) {
return x - y;
}
},MULTI {
@Override
double oper(double x, double y) {
return x * y;
}
},DIVIDS {//这里的除法是编译器的提起报错提示的要求必须重写下面的抽象方法
@Override
double oper(double x, double y) {
return x/y;
}
};
}
public static void main(String[] args) {
System.out.println(NormalActive.PLUS.oper(0.1, 0.2));
}
}
所以这回我们更清晰的认识到,枚举类中的每个枚举类型量都表示一个枚举类的实例对象并且,当前枚举类中定义的抽象方法是需要枚举类型实例来重写实现这个抽象方法的!!这就避免了人工忘写某些行为定义,编译器能提前报错。
终结总结: 1 枚举类型可以定义状态,每个状态的中具体的描述,状态值,原因,都是可以在枚举类型后的小括号中填写,
但是响应的,枚举构造方法也是对应的例如:
UNPAY(0,"未支付"),PAID(1,"已支付"),TIMOUT(-1,"超时");
private String desc;
private int status;
private String dbInfo;//其他属性
private DepotEnum(int status,String desc ) {
this.status = status;
this.desc = desc;
}
这是利用了枚举类中的成员变量做到的!!!
2 枚举来定义行为,
public enum BetterActive{
PLUS {
@Override
double oper(double x, double y) {
return x+y;
}
},MINUS {
@Override
double oper(double x, double y) {
return x - y;
}
},MULTI {
@Override
double oper(double x, double y) {
return x * y;
}
},DIVIDS {
@Override
double oper(double x, double y) {
return x/y;
}
};
abstract double oper(double x,double y);