Enum枚举类解析
Enum枚举类是java.lang包中的一个抽象类(abstract class Enum),实现了2个接口(Comparable<E>, Serializable)
在单例模式设计中,枚举类是一种天然的单例,并且可以防止反序列化bug
他有2个属性(name和ordinal),name就是枚举类的文本值,就是下面demo中的MAN和WOMAN,ordinal就是默认的int值,从0开始
相对应的有2个方法返回属性的值,name()返回name属性的值,ordinal()返回ordinal属性的值
所有的枚举类会自动继承Enum的构造方法
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
values()方法用于返回枚举类的所有实例的数组。
SexEnum[] values = SexEnum.values();
当然也可以给枚举类添加额外的属性,比如下面demo的desc属性(注意区别于枚举原有的name属性)
一个简单的枚举类的demo
package com.example.jdk.demo;
import java.util.Arrays;
public enum SexEnum {
MAN("男人"),
WOMAN("女人"),
;
private String desc;
public String getDesc() {
return desc;
}
SexEnum(String desc) {
this.desc = desc;
}
/**
* 通过自定义属性获取枚举实例
* @param desc
* @return
*/
public static SexEnum getbyDesc(String desc){
SexEnum sexEnum = Arrays.stream(SexEnum.values())
.filter(k->k.getDesc().equals(desc))
.findAny().orElse(null);
return sexEnum;
}
}
使用枚举demo
public class TestSexEnum {
@Test
public void test(){
//abstract class Enum 枚举类是一个抽象类
//测试Enum的name方法
SexEnum[] values = SexEnum.values();
for (SexEnum sex : values) {
System.out.println(sex);//Enum的toString方法返回的就是name属性,也就是枚举类的文本值
System.out.println(sex.ordinal());
System.out.println(sex.name());
}
/*
MAN
0
MAN
WOMAN
1
WOMAN
*/
}
}
普通文本值转换成枚举类实例
@Test
public void test1(){
SexEnum man = SexEnum.valueOf("MAN");
// SexEnum man = SexEnum.valueOf(SexEnum.MAN.name());
System.out.println(man.getDesc());//男人
}
通过自定义属性获取枚举实例
/**
* 通过自定义属性获取枚举实例
* @param desc
* @return
*/
public static SexEnum getbyDesc(String desc){
SexEnum sexEnum = Arrays.stream(SexEnum.values())
.filter(k->k.getDesc().equals(desc))
.findAny().orElse(null);
return sexEnum;
}
注意findAny()返回的是一个Optional对象,直接调用他的get方法如果value是null的话,会报错"No value present"
所有需要添加一个处理null的方法.orElse(null),而不是直接用get()
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
public T orElse(T other) {
return value != null ? value : other;
}
使用demo
@Test
public void test3(){
SexEnum man = SexEnum.getbyDesc("男人");
if (Objects.nonNull(man)){
System.out.println(man.getDesc());//男人
System.out.println(man.name());//MAN
System.out.println(man.ordinal());//0
}
}
浙公网安备 33010602011771号