Java 枚舉的基本使用方法及實(shí)際使用場(chǎng)景
一、什么是枚舉?
枚舉(enum)是 Java 中一種特殊的類,用于定義一組固定的常量。枚舉類型提供了更好的類型安全性和可讀性,適用于需要定義一組有限且固定的值的場(chǎng)景。枚舉常量是 public static final 的,可以直接通過(guò)枚舉類名訪問。
枚舉的主要特點(diǎn):
類型安全:限制了變量的取值范圍,避免了無(wú)效值的傳入。
代碼簡(jiǎn)潔:枚舉可以代替大量的常量定義,使代碼更簡(jiǎn)潔。
易于維護(hù):枚舉將相關(guān)的常量集中在一起,便于維護(hù)擴(kuò)展。
二、枚舉的基本使用方法
定義枚舉
通過(guò) enum 關(guān)鍵字定義,語(yǔ)法如下:
public enum 枚舉名 {
常量1,
常量2,
常量3;
}例如:星期
public enum Week {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}另外,枚舉還可以定義屬性和方法,甚至可以定義構(gòu)造函數(shù)。例如:
public enum Status {
ACTIVE(1, "激活"),
INACTIVE(2, "未激活");
private int code;
private String description;
// 枚舉的構(gòu)造函數(shù)
Status(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}枚舉類繼承自 java.lang.Enum ,有一些自帶的方法:比如 name()、ordinal()、values()、valueOf(String)。不過(guò)我一般比較少使用這些方法,實(shí)際中我會(huì)按下面使用枚舉。
三、實(shí)際使用場(chǎng)景
代替常量
枚舉可以用來(lái)替代傳統(tǒng)的常量定義(如 public static final int),提供更好的可讀性和類型安全性。
狀態(tài)機(jī)
表示有限的狀態(tài),比如狀態(tài)、類型等業(yè)務(wù)數(shù)據(jù)。例如:
public enum Status
{
OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "刪除");
private final String code;
private final String info;
Status(String code, String info)
{
this.code = code;
this.info = info;
}
public String getCode()
{
return code;
}
public String getInfo()
{
return info;
}
public static String getInfoByCode(String code){
for (Status value : values()) {
if (code.equals(value.code))return value.info;
}
return null;
}
public static List<String> getCodeList(){
List<String> codeList = new ArrayList<>();
for (Status value : Status.values()) {
codeList.add(value.getCode());
}
return codeList;
}
}四、更多用法
1.實(shí)現(xiàn)接口
枚舉可以實(shí)現(xiàn)接口,從而擴(kuò)展功能。
像上文中自定義方法 getCode()、getInfo() 、getInfoByCode() 和 getCodeList() 都是單獨(dú)為這個(gè)枚舉創(chuàng)建的。
我們可以定義一個(gè)通用的接口。
public interface KeyValueEnum<K, V> {
K getKey();
V getValue();
}然后枚舉類可以修改為:
public enum Status implements KeyValueEnum<String, String> {
OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "刪除");
private String key;
private String value;
Status(String key, String value) {
this.key = key;
this.value = value;
}
@Override
public String getKey() {
return key;
}
@Override
public String getValue() {
return value;
}
}getInfoByCode() 和 getCodeList()可以創(chuàng)建為工具類。
import java.util.ArrayList;
import java.util.List;
public class EnumUtils {
/**
* 根據(jù) key 獲取枚舉的 value
*
* @param enumClass 枚舉類
* @param key key
* @param <K> key 類型
* @param <V> value 類型
* @param <E> 枚舉類型
* @return 對(duì)應(yīng)的 value,如果未找到則返回 null
*/
public static <K, V, E extends Enum<E> & KeyValueEnum<K, V>> V getValueByKey(Class<E> enumClass, K key) {
for (E value : enumClass.getEnumConstants()) {
if (value.getKey().equals(key)) {
return value.getValue();
}
}
return null;
}
/**
* 根據(jù) value 獲取枚舉的 key
*
* @param enumClass 枚舉類
* @param value value
* @param <K> key 類型
* @param <V> value 類型
* @param <E> 枚舉類型
* @return 對(duì)應(yīng)的 key,如果未找到則返回 null
*/
public static <K, V, E extends Enum<E> & KeyValueEnum<K, V>> K getKeyByValue(Class<E> enumClass, V value) {
for (E e : enumClass.getEnumConstants()) {
if (e.getValue().equals(value)) {
return e.getKey();
}
}
return null;
}
/**
* 獲取枚舉類的所有 key 值
*
* @param enumClass 枚舉類
* @param <K> key 類型
* @param <V> value 類型
* @param <E> 枚舉類型
* @return 包含所有 key 的列表
*/
public static <K, V, E extends Enum<E> & KeyValueEnum<K, V>> List<K> getKeyList(Class<E> enumClass) {
List<K> keyList = new ArrayList<>();
for (E value : enumClass.getEnumConstants()) {
keyList.add(value.getKey());
}
return keyList;
}
}使用工具類:
public class Main {
public static void main(String[] args) {
// 獲取 Status 枚舉的所有 key 值
List<String> keyList = EnumUtils.getKeyList(Status.class);
System.out.println(keyList); // 輸出 ["0", "1", "2"]
// 根據(jù) key 獲取 value
String statusValue = EnumUtils.getValueByKey(Status.class, 1);
System.out.println(statusValue); // 輸出 "停用"
// 根據(jù) value 獲取 key
Integer statusKey = EnumUtils.getKeyByValue(Status.class, "正常");
System.out.println(statusKey); // 輸出 0
}
}2.單例模式
枚舉可以用來(lái)實(shí)現(xiàn)單例模式,確保一個(gè)類只有一個(gè)實(shí)例。
public enum Singleton {
INSTANCE;
public void example() {
System.out.println("枚舉實(shí)現(xiàn)單例模式");
}
}那么,為什么枚舉可以實(shí)現(xiàn)單例模式呢?
枚舉(enum)作為單例模式是一種非常優(yōu)雅且安全的實(shí)現(xiàn)方式。主要是因?yàn)椋?/p>
- 枚舉常量在 JVM 中是唯一的,每個(gè)枚舉常量都是枚舉類的一個(gè)實(shí)例。
- 枚舉常量在類加載時(shí)被初始化,且只會(huì)初始化一次。
- 枚舉的構(gòu)造函數(shù)是私有的,無(wú)法通過(guò)反射或手動(dòng)調(diào)用構(gòu)造函數(shù)創(chuàng)建新的實(shí)例。
- 枚舉的序列化和反序列化由 JVM 保證,反序列化時(shí)不會(huì)創(chuàng)建新的實(shí)例。
3.策略模式
枚舉可以用來(lái)實(shí)現(xiàn)簡(jiǎn)單的策略模式,每個(gè)枚舉常量可以定義自己的行為。
比如:進(jìn)行一些運(yùn)算。
public enum Operation {
ADD {
public int apply(int a, int b) {
return a + b;
}
},
SUBTRACT {
public int apply(int a, int b) {
return a - b;
}
};
public abstract int apply(int a, int b);
}總結(jié)
枚舉的使用可以使代碼的可讀性更高,更易于維護(hù),并且可以進(jìn)行一些特定的擴(kuò)展。但是要注意枚舉的使用場(chǎng)景,如果常量特別多或者會(huì)頻繁變化的值,就不適合使用枚舉。
到此這篇關(guān)于Java 枚舉的基本使用方法及實(shí)際使用場(chǎng)景的文章就介紹到這了,更多相關(guān)Java 枚舉用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單剖析Java中動(dòng)態(tài)線程池的擴(kuò)容以及縮容操作
這篇文章主要為大家詳細(xì)介紹了Java中動(dòng)態(tài)線程池的擴(kuò)容以及縮容操作的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決
這篇文章主要介紹了MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
MyBatis-Plus實(shí)現(xiàn)2種分頁(yè)方法(QueryWrapper查詢分頁(yè)和SQL查詢分頁(yè))
本文主要介紹了MyBatis-Plus實(shí)現(xiàn)2種分頁(yè)方法,主要包括QueryWrapper查詢分頁(yè)和SQL查詢分頁(yè),具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
關(guān)于Java8 parallelStream并發(fā)安全的深入講解
這篇文章主要給大家介紹了關(guān)于Java8 parallelStream并發(fā)安全的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

