什么是枚舉?
最近寫(xiě)新項(xiàng)目!有很多數(shù)據(jù)字典常量需要定義和使用、就順便記錄一下、什么是枚舉類(lèi)呢?就是用enum修飾是一種Java特殊的類(lèi),枚舉是class、底層是繼承了java.lang.Enum類(lèi)的實(shí)體類(lèi)、使用枚舉可以很方便的定義數(shù)據(jù)常量、方便清晰我們使用
為什么需要枚舉類(lèi)?
下面就舉例說(shuō)明一下吧
1)出于類(lèi)型安全考慮,沒(méi)用枚舉類(lèi)之前,常用靜態(tài)常量來(lái)表示。 比如對(duì)于性別的表示:
public static final int WOMAN = 0;public static final int MAN = 1;復(fù)制代碼
這種性別定義實(shí)際上是一個(gè)整數(shù)數(shù)據(jù)類(lèi)型。首先,這些變量可用于加減運(yùn)算。當(dāng)然我們很少這樣干 第二,含義不明確。我們調(diào)試的時(shí)候,最初將“男”輸出到,結(jié)果為1。因此,我們必須在前面尋找0的含義,尤其是當(dāng)我們查看其他人的代碼時(shí)。會(huì)看不懂、定義枚舉類(lèi)在類(lèi)里面進(jìn)行詳細(xì)說(shuō)明這樣的話就能清楚的知道含義。
2) 代碼更優(yōu)雅
在項(xiàng)目大一點(diǎn)當(dāng)中,可以使用數(shù)百個(gè)靜態(tài)常量。如果它們都寫(xiě)在一個(gè)文件類(lèi)里面的話,很容易造成命名混亂,程序也很難讀取。
3) 枚舉類(lèi)可以幫助我們定義所需的類(lèi)型
枚舉易于記憶和使用,相當(dāng)于一個(gè)接口。使用時(shí),只需封裝內(nèi)部數(shù)據(jù)類(lèi)型并限制數(shù)據(jù)字段。此外,可以為不同的枚舉變量調(diào)用不同的處理方法(這可以通過(guò)實(shí)現(xiàn)枚舉類(lèi)的抽象方法來(lái)實(shí)現(xiàn))。
枚舉類(lèi)的定義和使用
下面就定義一個(gè)試題類(lèi)型的枚舉類(lèi)吧
/** * 試題類(lèi)型 枚舉類(lèi); 0 填空題、1 判斷 題、2 單選題、3 多選題、4 簡(jiǎn)答題、5 問(wèn)答題、6 論述題、7 計(jì)算題、8 畫(huà)圖題、9 其他題 * @author lyy * @date 2022/05/23 */public enum TopicTypeEnum { /** 填空題 */ FILL_IN_THE_BLANK(0, “填空題”), /** 判斷題 */ JUDGE(1, “判斷題”), /** 單選題 */ SINGLE_CHOICE(2, “單選題”), /** 多選題 */ MULTIPLE_CHOICE(3, “多選題”), /** 簡(jiǎn)答題 */ BRIEF_ANSWER(4, “簡(jiǎn)答題”), /** 問(wèn)答題 */ QUESTIONS_AND_ANSWERS(5, “問(wèn)答題”), /** 論述題 */ DISCUSS(6, “論述題”), /** 計(jì)算題 */ COMPUTE(7, “計(jì)算題”), /** 畫(huà)圖題 */ //最后一個(gè)類(lèi)型必須要用分號(hào)結(jié)束 DRAW_PICTURE(9, “畫(huà)圖題”); /** 值 */ private final Integer code; /** 名稱 */ private final String name; public static TopicTypeEnum getByCode(Integer code) { if (null == code) { return null; } for (TopicTypeEnum status : TopicTypeEnum.values()) { if (status.getCode().intValue() == code.intValue()) { return status; } } return null; } public static TopicTypeEnum getByName(String name) { for (TopicTypeEnum status : TopicTypeEnum.values()) { if (status.getName().equals(name)) { return status; } } return null; } public static List getNameCode() { return Stream.of(TopicTypeEnum.values()) .map(item -> new NameCode(item.getCode(), item.getName())) .collect(Collectors.toList()); } TopicTypeEnum (Integer code, String name) { this.code = code; this.name = name; } public Integer getCode() { return code; } public String getName() { return name; } /** * @author lyy * @date 2022/06/14 * @return 枚舉對(duì)象數(shù)組 */ public static List
枚舉類(lèi)的常用方法
- valueOf():返回當(dāng)前枚舉類(lèi)的name屬性,如果沒(méi)有,則throw new java.lang.IllegalArgumentException()。具體可以查看java.lang.Enum源碼。
- values():返回包括所有枚舉變量的數(shù)組。
- toString(),name():返回當(dāng)前枚舉類(lèi)變量的name屬性
- ordinal():枚舉類(lèi)會(huì)給所有的枚舉變量一個(gè)默認(rèn)的次序,該次序從0開(kāi)始,是根據(jù)我們定義的次序來(lái)排序的。而ordinal()方法就是獲取這個(gè)次序(或者說(shuō)下標(biāo))。
- compareTo():返回兩個(gè)次序相減后的結(jié)果。