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号
浙公网安备 33010602011771号