你真的了解java的枚举吗?


最近在跟着做springboot的项目时,发现视频中用到了枚举的技术,当时一顿感叹,纳尼?!!枚举还能这么用!!!

//定义枚举public enum ResultEnum {UNKONW_ERROR(-1, "未知错误"),SUCCESS(0, "成功"),PRIMARY_SCHOOL(100, "我猜你可能还在上小学"),MIDDLE_SCHOOL(101, "你可能在上初中"),;private Integer code;private String msg;ResultEnum(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public String getMsg() {return msg;}}//使用枚举public class GirlException extends RuntimeException{private Integer code;public GirlException(ResultEnum resultEnum) {super(resultEnum.getMsg());this.code = resultEnum.getCode();}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}}//enum作为参数传递public void getAge(Integer id) throws Exception{Girl girl = girlRepository.findOne(id);Integer age = girl.getAge();if (age < 10) {//返回"你还在上小学吧" code=100throw new GirlException(ResultEnum.PRIMARY_SCHOOL);}else if (age > 10 && age < 16) {//返回"你可能在上初中" code=101throw new GirlException(ResultEnum.MIDDLE_SCHOOL);}}

哎,没办法,还是自己java的基础不扎实,于是回去查资料,重学了枚举!!!

一.什么是枚举?

在java中枚举用enum来表示;

我们官方文档可知
枚举本质其实也是类,(java中万物皆是类)
你真的了解java的枚举吗?(enum)_枚举
那既然是类,我们不仅可以在里面定义常量,还可以定义成员变量,构造方法,get/set方法;

.1可以定义常量

比如这里我们就定义了一个只含有常量的枚举

public enum Season {SPRING,SUMMER,FALL,WINTER}

其实这里常量的本质是一个静态final对象

public static final Season SPRING = new Season();public static final Season SUMMER = new Season();public static final Season FALL = new Season();public static final Season WINTER = new Season();

那怎么使用呢?
直接通过enum名调用,因为是static静态嘛

	Season s = Season.SPRING;
	System.out.println(s.name());//SPRING
	System.out.println(s.ordinal());//1

  • s.name()方法打印结果是该常量的名字
  • s.ordinal()打印的是该常量在枚举中位置

.2可以定义成员变量

那如果我们要定义成员变量呢?

public enum Season {SPRING,SUMMER,FALL,WINTER;private int startTime;private int endTime;private int startTime;private int endTime;//下面是get/set方法public int getStartTime() {return startTime;}public void setStartTime(int startTime) {this.startTime = startTime;}public int getEndTime() {return endTime;}public void setEndTime(int endTime) {this.endTime = endTime;}}

注意:

  • 如果定义了成员变量,成员变量必须放在常量的后面!!
  • 并且,常量最后要加分号!!

.3可以含有构造方法

注意:-

  • 构造方法只能是private或者无修饰符;
  • 并且你不能主动调用构造方法,java会主动调用构造方法来初始化常量

自定义构造方法:
我们可以定义一个有参构造方法;

public enum Season {SPRING(5,10),SUMMER(25,10),FALL(10,15),WINTER(10,20);private int min;private int max;Season(int min ,int max){this.min = min;this.max = max;}//get,set方法就省略了}

说说这是什么意思:

如果我们自定义了有参构造方法,那么在我们初始化常量的时候,java会自动调用有参构造方法为常量赋值,

因为我之前提到过,常量的本质是一个对象,那既然是对象,肯定要通过构造方法来创建是吧?

所以我们给常量SPRING初始化5,10两个值,那么此时java就会把5传递给min,10传递给max,从而创建对象;

接下来就是怎么使用了,很简单
比如此时我们需要常量SPRING的min值,
首先获取该常量,然后通过该常量直接调用对应的get方法即可

	Season s = Season.SPRING;System.out.println(s.getMin());System.out.println(s.getMax());

当然这里我们也可以链式编程:

System.out.println(Season.SPRING.getMin());System.out.println(Season.SPRING.getMax());

讲到这里相信大家应该能够看懂我开篇放的例子了!!!

那好,我们知道枚举是什么了,那枚举有什么用呢?或者在实际开发中用的多还是少呢?

二.为什么要使用枚举?

如果一个变量的取值只可能是几个固定的值,此时我们可以考虑使用枚举!!
比如,

季节就只有春夏秋冬,这么4个取值;
一周就只有周一到周七,这么7个取值;
一个状态可能有好,坏,较好等取值

这样做的好处是方便我们修改,简化我们的代码
现在你们可能体会不到,但是当你们以后做一个大项目的时候
里面定义很多常量,但此时你没有使用枚举,如果你想改动,那么你会发现这简直太麻烦了!!
那么此时我们可以把这些常量抽取为一个枚举类,以后要修改,直接在枚举类里面修改即可,这样不是轻松很多?

而且枚举也可以作为参数进行传递,简化了代码量;