1. 程式人生 > 其它 >Enum列舉類解析

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

  

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