更新时间:2020-07-08 来源:黑马程序员 浏览量:
1.1 什么是枚举
Java 1.5引入了一个新特性,枚举!枚举的本质是一个类,用于定义静态常量;
枚举类特点:
·枚举类用特有关键字enum修饰的类,本质是类,很特殊的类
·类不能被创建new对象,不能被继承
·枚举类中写的都是成员变量
·【原理】枚举类中,成员变量被final和static修饰,默认的,不用写
1.2 开发时,如何使用枚举?
/**
 * 返回给用户,信息枚举类
 */
public enum MessageEnum {
    ACTION_SUCCESS("操作成功"),
    ACTION_FAIL("操作失败"),
    DELETE_CHECKITEM_FAIL("删除检查项失败"),
    DELETE_CHECKITEM_SUCCESS("删除检查项成功"),
    ADD_CHECKITEM_SUCCESS("新增检查项成功"),
    ADD_CHECKITEM_FAIL("新增检查项失败"),
    EDIT_CHECKITEM_FAIL("编辑检查项失败"),
    EDIT_CHECKITEM_SUCCESS("编辑检查项成功"),
    QUERY_CHECKITEM_SUCCESS("查询检查项成功"),
    QUERY_CHECKITEM_FAIL("查询检查项失败"),
    UPLOAD_SUCCESS("上传成功"),
    ADD_CHECKGROUP_FAIL("新增检查组失败"),
    ADD_CHECKGROUP_SUCCESS("新增检查组成功"),
    DELETE_CHECKGROUP_FAIL("删除检查组失败"),
    DELETE_CHECKGROUP_SUCCESS("删除检查组成功"),
    QUERY_CHECKGROUP_SUCCESS("查询检查组成功"),
    QUERY_CHECKGROUP_FAIL("查询检查组失败"),
    EDIT_CHECKGROUP_FAIL("编辑检查组失败"),
    EDIT_CHECKGROUP_SUCCESS("编辑检查组成功"),
    PIC_UPLOAD_SUCCESS("图片上传成功"),
    PIC_UPLOAD_FAIL("图片上传失败"),
    ADD_SETMEAL_FAIL("新增套餐失败"),
    ADD_SETMEAL_SUCCESS("新增套餐成功"),
    IMPORT_ORDERSETTING_FAIL("批量导入预约设置数据失败"),
    IMPORT_ORDERSETTING_SUCCESS("批量导入预约设置数据成功"),
    GET_ORDERSETTING_SUCCESS("获取预约设置数据成功"),
    GET_ORDERSETTING_FAIL("获取预约设置数据失败"),
    ORDERSETTING_SUCCESS("预约设置成功"),
    ORDERSETTING_FAIL("预约设置失败"),
    ADD_MEMBER_FAIL("新增会员失败"),
    ADD_MEMBER_SUCCESS("新增会员成功"),
    DELETE_MEMBER_FAIL("删除会员失败"),
    DELETE_MEMBER_SUCCESS("删除会员成功"),
    EDIT_MEMBER_FAIL("编辑会员失败"),
    EDIT_MEMBER_SUCCESS("编辑会员成功"),
    TELEPHONE_VALIDATECODE_NOTNULL("手机号和验证码都不能为空"),
    LOGIN_SUCCESS("登录成功"),
    VALIDATECODE_ERROR("验证码输入错误"),
    QUERY_ORDER_SUCCESS("查询预约信息成功"),
    QUERY_ORDER_FAIL("查询预约信息失败"),
    QUERY_SETMEALLIST_SUCCESS("查询套餐列表数据成功"),
    QUERY_SETMEALLIST_FAIL("查询套餐列表数据失败"),
    QUERY_SETMEAL_SUCCESS("查询套餐数据成功"),
    QUERY_SETMEAL_FAIL("查询套餐数据失败"),
    SEND_VALIDATECODE_FAIL("验证码发送失败"),
    SEND_VALIDATECODE_SUCCESS("验证码发送成功"),
    SELECTED_DATE_CANNOT_ORDER("所选日期不能进行体检预约"),
    ORDER_FULL("预约已满"),
    HAS_ORDERED("不能重复预约"),
    ORDER_SUCCESS("预约成功"),
    GET_USERNAME_SUCCESS("获取当前登录用户名称成功"),
    GET_USERNAME_FAIL("获取当前登录用户名称失败"),
    GET_MENU_SUCCESS("获取当前登录用户菜单成功"),
    GET_MENU_FAIL("获取当前登录用户菜单失败"),
    GET_MEMBER_NUMBER_REPORT_SUCCESS("获取会员统计数据成功"),
    GET_MEMBER_NUMBER_REPORT_FAIL("获取会员统计数据失败"),
    GET_SETMEAL_COUNT_REPORT_SUCCESS("获取套餐统计数据成功"),
    GET_SETMEAL_COUNT_REPORT_FAIL("获取套餐统计数据失败"),
    GET_BUSINESS_REPORT_SUCCESS("获取运营统计数据成功"),
    GET_BUSINESS_REPORT_FAIL("获取运营统计数据失败"),
    GET_SETMEAL_LIST_SUCCESS("查询套餐列表数据成功"),
    GET_SETMEAL_LIST_FAIL("查询套餐列表数据失败"),
    SETMEAL_GET_TOKEN("套餐获取TOKEN成功"),
    ADD_IMGNAME_REDI("添加图片名称到Redis成功");
    private final String msg;
    MessageEnum(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
}
/**
 * 返回信息封装对象Result
 */
public class Result implements Serializable {
  private boolean flag;//执行结果,true为执行成功 false为执行失败
  private String message;//返回结果信息
  private Object data;//返回数据
  //Getter、Setter、toString、空参构造、满参构造
}
 /**
  * 1. 获取客户端手机号及验证码
  * 2. 根据手机号获取redis验证码
  * 3. 判断用户验证码与redis验证码是否匹配
  *    1. 如果匹配失败,返回验证码错误
  *    2.如果成功,根据手机号获取会员信息
  *        1. 如果有会员,登录成功
  *        2. 如果不是会员,封装Member对象,调用Service保存
  * @param map
  * @return
  */
 @RequestMapping("/check")
 public Result check(@RequestBody Map<String,String> map){
  log.debug("LoginController: check: " + map);
  // 获取客户端手机号及验证码
  String telephone = map.get("telephone");
  String validateCode = map.get("validateCode");
  // 读取Redis验证码
  String codeInRedis = jedisPool.getResource().get(telephone+ "-"+ RedisConst.SENDTYPE_LOGIN);
  if(codeInRedis == null || codeInRedis.length()==0 ){
   return new Result(false, MessageEnum.TELEPHONE_VALIDATECODE_NOTNULL.getMsg());
  }
  if ( !codeInRedis.equals(validateCode) ){
   return new Result(false, MessageEnum.VALIDATECODE_ERROR.getMsg());
  }
  memberService.saveOrEdit(telephone);
  log.debug("登录成功, 保存会员信息成功!!!");
  return new Result(true, MessageEnum.LOGIN_SUCCESS.getMsg());
 }
 /**
  * 1. 获取客户端手机号及验证码
  * 2. 根据手机号获取redis验证码
  * 3. 判断用户验证码与redis验证码是否匹配
  *    1. 如果匹配失败,返回验证码错误
  *    2.如果成功,根据手机号获取会员信息
  *        1. 如果有会员,登录成功
  *        2. 如果不是会员,封装Member对象,调用Service保存
  * @param map
  * @return
  */
 @RequestMapping("/check")
 public Result checkAge(@RequestBody Map<String,String> map){
  log.debug("LoginController: check: " + map);
  // 获取客户端手机号及验证码
  String telephone = map.get("telephone");
  String validateCode = map.get("validateCode");
  // 读取Redis验证码
  String codeInRedis = jedisPool.getResource().get(telephone+ "-"+ RedisConst.SENDTYPE_LOGIN);
  if(codeInRedis == null || codeInRedis.length()==0 ){
   return new Result(false, "验证码输入不能为空");
  }
  if ( !codeInRedis.equals(validateCode) ){
   return new Result(false, "验证码输入错误");
  }
  memberService.saveOrEdit(telephone);
  log.debug("登录成功, 保存会员信息成功!!!");
  return new Result(true, "登录成功");
 }
1.3 没有枚举之前,怎么做的?
·第一阶段:在类的方法中
·缺陷问题:开发不可能只一个类!
·不能复用
·"大海捞针式"修改局部变量
·无法统一维护系统局部变量
public class WeekValue {
    public static void main(String[] args) {
        //第一阶段:定义局部变量,字面值
  String one = "星期1";
        String one1 = "星期一";
        String two = "星期二";
        String three = "星期三";
        String four = "星期四";
        String five = "星期五";
        String six = "星期六";
        String seven = "星期七";
        //性别
        String man = "男";
        String women = "女";
        //颜色
        String red = "红色";
        String yellow = "黄色";
        String green = "绿色";
        //状态
        String save = "新增成功";
        String update = "修改成功";
        String del = "删除成功";
        String find = "查询成功";
    }
}
第二阶段:在类的常量,静态static和final修饰
解决问题:
·不能复用
·"大海捞针式"修改局部变量
·缺陷问题:
·不能统一维护系统局部变量
·不遵循类单一职责原则
public class WeekValue {
    public  static final String ONE = "星期一";
    public  static final String ONE1 = "星期一";
    public  static final String TWO = "星期二";
    public  static final String THREE = "星期三";
    public  static final String FOUR = "星期四";
    public  static final String FIVE = "星期五";
    public  static final String SIX = "星期六";
    public  static final String SEVEN = "星期七";
    //性别
    public  static final  String MAN = "男";
    public  static final  String WOMEN = "女";
     //颜色
    public  static final  String RED = "红色";
    public  static final  String YELLOW = "黄色";
    public  static final  String GREEN = "绿色";
    //状态
    public  static final  String SAVE = "新增成功";
    public  static final  String UPDATE = "修改成功";
    public  static final  String DEL = "删除成功";
    public  static final  String FIND = "查询成功";
}
第三阶段:在静态常量类中
解决问题:
·不能复用
·"大海捞针式"修改局部变量
·不能统一维护系统局部变量
·不遵循类单一职责原则
缺陷问题:
·对自定义类型对象常量支持不是很好,不太好扩展
·类职责,从设计的角度,没有划清界限!有些智障男孩, 总是会用静态常量类去创建对象,或在静态常量类中写业务代码!
/**
 * 返回给用户,信息枚举类
 */
public class MessageEnum {
    public static final String GET_BUSINESS_REPORT_SUCCESS = "获取运营统计数据成功";
    public static final String GET_BUSINESS_REPORT_FAIL = "获取运营统计数据失败";
    public static final String GET_SETMEAL_LIST_SUCCESS = "查询套餐列表数据成功";
    public static final String GET_SETMEAL_LIST_FAIL = "查询套餐列表数据失败";
    public static final String SETMEAL_GET_TOKEN = "套餐获取TOKEN成功";
    public static final String ADD_IMGNAME_REDI = "添加图片名称到Redis成功";
    //.....
}
1.4 枚举原理解析
枚举的出现解决了之前常量定义的诸多问题:
解决问题:
·不能复用
·"大海捞针式"修改局部变量
·不能统一维护系统局部变量
·不遵循类单一职责原则
·对自定义类型对象常量支持不是很好,不太好扩展
·类职责,从设计的角度,没有划清界限!有些智障男孩, 总是会用静态常量类去创建对象,或在静态常量类中写业务代码!
·枚举类不能创建对象
·枚举类不能继承
public enum WeekEnum {
    MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
枚举!枚举的本质是一个类,用于定义静态常量;我们可以通过反编译WeekEnum.class字节码文件,过滤掉编译器"语法糖",就是看到枚举的本来面目,其实就一个类;
反编译工具jad.exe,反编译命令:
jad -sjava WeekEnum.class
WeekEnum枚举类,反编译后的java文件;证明枚举类是个final修饰,内含常量的类
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   WeekEnum.java
public final class WeekEnum extends Enum
{
    public static WeekEnum[] values()
    {
        return (WeekEnum[])$VALUES.clone();
    }
    public static WeekEnum valueOf(String name)
    {
        return (WeekEnum)Enum.valueOf(WeekEnum, name);
    }
    private WeekEnum(String s, int i)
    {
        super(s, i);
    }
    public static final WeekEnum MONDAY;
    public static final WeekEnum TUESDAY;
    public static final WeekEnum WEDNESDAY;
    public static final WeekEnum THURSDAY;
    public static final WeekEnum FRIDAY;
    public static final WeekEnum SATURDAY;
    public static final WeekEnum SUNDAY;
    private static final WeekEnum $VALUES[];
    static 
    {
        MONDAY = new WeekEnum("MONDAY", 0);
        TUESDAY = new WeekEnum("TUESDAY", 1);
        WEDNESDAY = new WeekEnum("WEDNESDAY", 2);
        THURSDAY = new WeekEnum("THURSDAY", 3);
        FRIDAY = new WeekEnum("FRIDAY", 4);
        SATURDAY = new WeekEnum("SATURDAY", 5);
        SUNDAY = new WeekEnum("SUNDAY", 6);
        $VALUES = (new WeekEnum[] {
            MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
        });
    }
}
猜你喜欢:
Java中级程序员培训课程
1024首播|39岁程序员逆袭记:不被年龄定义,AI浪潮里再迎春天
2025-10-241024程序员节丨10年同行,致敬用代码改变世界的你
2025-10-24【AI设计】北京143期毕业仅36天,全员拿下高薪offer!黑马AI设计连续6期100%高薪就业
2025-09-19【跨境电商运营】深圳跨境电商运营毕业22个工作日,就业率91%+,最高薪资达13500元
2025-09-19【AI运维】郑州运维1期就业班,毕业14个工作日,班级93%同学已拿到Offer, 一线均薪资 1W+
2025-09-19【AI鸿蒙开发】上海校区AI鸿蒙开发4期5期,距离毕业21天,就业率91%,平均薪资14046元
2025-09-19