欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你真的了解java的枚举吗?(enum)

程序员文章站 2024-03-23 14:54:52
...

最近在跟着做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=100
            throw new GirlException(ResultEnum.PRIMARY_SCHOOL);
        }else if (age > 10 && age < 16) {
            //返回"你可能在上初中" code=101
            throw 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个取值;
一个状态可能有好,坏,较好等取值

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

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