1、枚举的本质就是穷举法,将可能会出现的情况,都列举出来,然后在列举的情况中调用。
2、枚举与class类似,也可以定义属性,构造方法,有getter和setter方法。
3、枚举类型对象的值之间比较可以通过==比较,当然也可以通过equals比较。
4、枚举类型是线程安全的,只会装载一次。
5、使用枚举类型优化if-else。
public enum MyColors {
RED, BLUE, WHITE,GREEN
}
通过枚举打点直接获取
public static void main(String[] args) {
System.out.println(MyColors.YELLOW);
}
MyColors color = MyColors.RED;
switch (color) {
case RED: System.out.println("==red==");break;
case BLUE: System.out.println("==yellow==");break;
case GREEN: System.out.println("==green==");break;
}
public static void main(String[] args) {
for (MyColors color : MyColors.values()) {
System.out.println(color.ordinal()+"<==序数 值==>"+color);
}
}
通过方法可以为成员属性指定特定的行为,如PARAM_ERROR表示参数错误。
说明1:定义了两个参数code和message。
说明2:需要给code和message定义set和get方法及有参构造器。
//订单状态枚举类型
public enum OrderStatus{
PARAM_ERROR(1, "参数错误"),
CART_EMPTY(2, "购物车为空"),
ORDER_NOT_EXIST(3, "订单不存在");
private Integer code;
private String message;
//构造器
private OrderStatus(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public static void main(String[] args) {
System.out.println(OrderStatus.ORDER_NOT_EXIST);
System.out.println(OrderStatus.ORDER_NOT_EXIST.getCode());
System.out.println(OrderStatus.ORDER_NOT_EXIST.getMessage());
}
结果输出:
public static void main(String[] args) {
for (OrderStatus status : OrderStatus.values()) {
System.out.print("状态值=>"+status.name());
System.out.print(" 状态序列=>"+status.ordinal());
System.out.print(" 状态码=>"+status.getCode());
System.out.println(" 状态信息=>"+status.getMessage());
}
}
有时候在项目中创建的枚举类型可能会非常的多,我们可以使用枚举类型将同类型的枚举类放置在一块进行管理。
//订单枚举类型
public interface OrderEnum {
//订单状态枚举类
enum OrderStatus implements OrderEnum{
//订单错误,订单成功,订单不存在
ORDER_ERROR,ORDER_SUCCESS,ORDER_NOT_EXIST;
}
//订单类型枚举类
enum OrderType implements OrderEnum{
//电子,食品,书籍
ELECTRON,FOOD,BOOKS;
}
}
通过EnumMap可以为枚举的成员属性赋予特定的行为,功能与在枚举类型中定义方法相似。
public enum MyColors {
RED, GREEN, BLANK, YELLOW
}
public static void main(String[] args) {
//使用
EnumMap enumMap = new EnumMap<>(MyColors.class);
enumMap.put(MyColors.RED,"红色");
enumMap.put(MyColors.BLANK,"黑色");
enumMap.put(MyColors.GREEN,"绿色");
String result = enumMap.get(MyColors.RED);
System.out.println("result==>"+result);
}
输出结果:result==>红色
EnumSet可以获取当前的枚举中有那些成员属性
public enum MyColors {
RED, GREEN, BLANK, YELLOW
}
//EnumSet导包路径 import java.util.EnumSet;
EnumSet enumSet=EnumSet.allOf(MyColors.class);
System.out.print(enumSet+" ");
}
//输出结果:[RED, GREEN, BLANK, YELLOW]
这种用法的不好之处在于,可读性不高
String orderStatus="PAYED";
if(orderStatus.equals("PAYED")){
System.out.println("====已支付====");
}else if(orderStatus.equals("SHIPPED")){
System.out.println("====已发货====");
}else if(orderStatus.equals("ARRIVED")){
System.out.println("====已到达====");
}else if(orderStatus.equals("SIGNEDFOR")){
System.out.println("====已签收====");
}else{
System.out.println("====已取消====");
}
public interface OrderProcessInterface {
//通过订单状态,返回不同的结果
public String orderStatus(String status);
}
//订单进度
public enum OrderProcessEnum implements OrderProcessInterface{
/**
* PAYED:已支付,SHIPPED:已发货
* ARRIVED:已到达,SIGNEDFOR:已签收
* CANCELLATION:已取消
*/
PAYED{
@Override
public String orderStatus(String status) {
// TODO Auto-generated method stub
return "PAYED-已支付";
}
},
SHIPPED{
@Override
public String orderStatus(String status) {
// TODO Auto-generated method stub
return "PAYED-已签收";
}
},
ARRIVED{
@Override
public String orderStatus(String status) {
// TODO Auto-generated method stub
return "PAYED-已达到";
}
},
SIGNEDFOR{
@Override
public String orderStatus(String status) {
// TODO Auto-generated method stub
return "PAYED-已签收";
}
},
CANCELLATION{
@Override
public String orderStatus(String status) {
// TODO Auto-generated method stub
return "PAYED-已取消";
}
}
}
public static void main(String[] args) {
String orderStatus="PAYED";
String status = OrderProcessEnum.valueOf(orderStatus).orderStatus(orderStatus);
System.out.println(status);
}
//返回值: PAYED-已支付