Java枚举
1、什么是枚举
枚举类型在本质上也是一个类,但是由于编译器自动做了很多事情,因此它的使用更为便捷、安全和方便。
枚举是有穷尽的,有些类的实例对象是固定的。例如季节(Season),只有春(SPRING)、夏(SUMMER)、秋(AUTUMN)、冬(WINTER)这四个,这时候的枚举作用就出来了,可以使用switch…case语句来进行枚举类型的判断。
枚举是一组相同类型的有限个数的数据,每一个枚举类型都是当前枚举类的一个对象。
//获取当前的一个季节的枚举类型,返回的是一个季节的对象 Season season = Season.SPRING;
2、定义枚举类型
①定义枚举的语法
- 在枚举类中,枚举类型总是定义在其他字段/方法/构造器的前面。枚举以逗号分隔,分号结束。枚举类型结束之后才能开始写其他内容。
- 在枚举类中,每一个枚举类型都是当前枚举类的一个对象。
- 如果枚举需要维护成员变量,必须要提供私有构造方法,并且每一个枚举类型都要维护上成员变量,而想要获取成员变量就需要提供字段以及相对应的getter/setter方法。注!构造器默认私有化,因为枚举类型的初始化都要在当前类中完成。
语法:
public enum 枚举类名称{
枚举类型1,
枚举类型2,
枚举类型3;
}
②定义一个简单的枚举类型
仍然拿春夏秋冬举例:
/**
* 这是一个季节对象的枚举类
*/
public enum Season {
/**
* <p>在枚举类中,枚举类型是以逗号分割,而且必须是在其他字段、构造器、方法的上面写,以分号结尾才能开始写其他内容</p>
* <p>在枚举类中,每一个枚举类型都是一个当前类的一个对象</p>
*/
SPRING,
SUMMER,
AUTUMN,
WINTER;
}
可以使用字符串儿进行是否符合当前枚举类型的判断or直接调用枚举类型:
@Test
public void testSeasonEnum() {
//String param = "SUMMER";
//Season season = Season.valueOf(param); //通过valueof比较获取到枚举对象
// or
Season season = Season.SPRING; //返回的是一个季节的春季对象
//用在switch——case中
switch (season) {
case SPRING:
System.out.println("这是一个春天");
break;
case SUMMER:
System.out.println("这是一个夏天");
break;
case AUTUMN:
System.out.println("这是一个秋天");
break;
case WINTER:
System.out.println("这是一个冬天");
break;
}
}
输出:
③定义较复杂的一个枚举类
如果想要在春夏秋冬的枚举类型中输数当前是什么季节和季节特征的描述,就需要在枚举类型中进行成员变量的维护。而变量的顺序对应的是构造方法中变量的顺序。
/**
* 这是一个季节对象的枚举类
*/
public enum Season2 {
/**
* <p>在枚举类中,枚举类型是以逗号分割,而且必须是在其他字段、构造器、方法的上面写,以分号结尾才能开始写其他内容</p>
* <p>在枚举类中,每一个枚举类型都是一个当前类的一个对象</p>
* <p>枚举变量在最前面定义,如果有成员变量需要维护,必须所有的对象全部要维护上成员变量:如seasonName和seasonDesc</p>
*/
SPRING("春天", "这是一个和风细雨的春天!"),
SUMMER("夏天", "这是一个烈日炎炎的夏天!"),
AUTUMN("秋天", "这是一个秋高气爽的秋天!"),
WINTER("冬天", "这是一个寒风凛凛的冬天!");
private String seasonName;
private String seasonDesc;
/**
* 枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。
* 通过构造器可以给枚举类型传递值,在没有空构造器的时候必须要对枚举类型赋值
* 如果想要获取到当前对象(枚举类型的值可以指定字段和getter/setter方法来获取)
*
* @param seasonName
* @param seasonDesc
*/
private Season2(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public void setSeasonName(String seasonName) {
this.seasonName = seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
public void setSeasonDesc(String seasonDesc) {
this.seasonDesc = seasonDesc;
}
}
这里同样可以使用字符串儿进行是否符合当前枚举类型的判断or直接调用枚举类型:
@Test
public void testSeason2Enum() {
String param = "SUMMER";
Season2 season2 = Season2.valueOf(param); //通过valueof比较获取到枚举对象
// or
//Season2 season2 = Season2.SPRING;
//用在switch——case中,从枚举对象中获取当前季节的名称以及季节的描述
switch (season2) {
case SPRING:
System.out.println(season2.getSeasonName() + ":" + season2.getSeasonDesc());
break;
case SUMMER:
System.out.println(season2.getSeasonName() + ":" + season2.getSeasonDesc());
break;
case AUTUMN:
System.out.println(season2.getSeasonName() + ":" + season2.getSeasonDesc());
break;
case WINTER:
System.out.println(season2.getSeasonName() + ":" + season2.getSeasonDesc());
break;
}
}
输出结果:
3、枚举类型定义返回状态及描述信息
/**
* 定义返回状态码的枚举类型
*/
public enum ResultCode {
//定义返回状态的枚举类型
SUCCESS(1, "返回成功!"),
FAIL(-999, "未知错误!");
/**
* 返回状态码
*/
private Integer code;
/**
* 状态码信息描述
*/
private String message;
private ResultCode(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;
}
}
测试:
@Test
public void testGetResultCode() {
System.out.println(ResultCode.SUCCESS.getCode() + ":" + ResultCode.SUCCESS.getMessage());
}
输出:
参考连接
https://blog.csdn.net/cauchy6317/article/details/82313088
https://blog.csdn.net/weixin_42740530/article/details/106474224
https://baike.baidu.com/item/%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B/2978296