Enum列舉類解析
阿新 • • 發佈:2022-03-13
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 } }