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 } }