亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 枚舉的基本使用方法及實(shí)際使用場(chǎng)景

 更新時(shí)間:2025年06月05日 14:21:08   作者:aDakkke  
枚舉是 Java 中一種特殊的類,用于定義一組固定的常量,枚舉類型提供了更好的類型安全性和可讀性,適用于需要定義一組有限且固定的值的場(chǎng)景,本文給大家介紹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)文章

  • java使用FileVisitor遍歷文件和目錄

    java使用FileVisitor遍歷文件和目錄

    這篇文章主要為大家詳細(xì)介紹了java使用FileVisitor遍歷文件和目錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 簡(jiǎn)單剖析Java中動(dòng)態(tài)線程池的擴(kuò)容以及縮容操作

    簡(jiǎn)單剖析Java中動(dòng)態(tài)線程池的擴(kuò)容以及縮容操作

    這篇文章主要為大家詳細(xì)介紹了Java中動(dòng)態(tài)線程池的擴(kuò)容以及縮容操作的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • Java簡(jiǎn)單從文件讀取和輸出的實(shí)例

    Java簡(jiǎn)單從文件讀取和輸出的實(shí)例

    下面小編就為大家?guī)?lái)一篇Java簡(jiǎn)單從文件讀取和輸出的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Mybatis源碼分析之插件模塊

    Mybatis源碼分析之插件模塊

    今天給大家?guī)?lái)的是關(guān)于Mybatis的相關(guān)知識(shí),文章圍繞著Mybatis插件模塊展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    這篇文章主要介紹了MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Spring多線程的使用以及問題詳解

    Spring多線程的使用以及問題詳解

    在我們開發(fā)系統(tǒng)過(guò)程中,經(jīng)常會(huì)處理一些費(fèi)時(shí)間的任務(wù)(如:向數(shù)據(jù)庫(kù)中插入大量數(shù)據(jù)),這個(gè)時(shí)候就就需要使用多線程,下面這篇文章主要給大家介紹了關(guān)于Spring多線程的使用以及問題的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • MyBatis-Plus實(shí)現(xiàn)2種分頁(yè)方法(QueryWrapper查詢分頁(yè)和SQL查詢分頁(yè))

    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
  • 如何在32位Windows系統(tǒng)下安裝Java

    如何在32位Windows系統(tǒng)下安裝Java

    這篇文章主要介紹了如何在32位Windows系統(tǒng)下安裝Java,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • hystrix服務(wù)降級(jí)方法使用介紹

    hystrix服務(wù)降級(jí)方法使用介紹

    什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁(yè)面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作
    2022-09-09
  • 關(guān)于Java8 parallelStream并發(fā)安全的深入講解

    關(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

最新評(píng)論