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

  

posted on 2022-03-13 13:33  乌云上  阅读(271)  评论(0编辑  收藏  举报

导航