0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你知道Java中枚舉的這些神仙用法嗎?

冬至子 ? 來(lái)源:JAVA旭陽(yáng) ? 作者:JAVA旭陽(yáng) ? 2023-06-05 11:44 ? 次閱讀

概述

Java中的枚舉,大家在項(xiàng)目中經(jīng)常使用吧,主要用來(lái)定義一些固定值,在一個(gè)有限的集合內(nèi),比如在表示一周的某一天,一年中的四季等。那你了解枚舉的本質(zhì)嗎,或者說(shuō)底層是什么樣的?了解枚舉的一些神仙用法嗎?

枚舉介紹和使用

枚舉主要用來(lái)定義一個(gè)有限集合內(nèi)的固定值。

枚舉定義方式如下:

// 簡(jiǎn)單的定義
enum WeekEnum {
    MONDAY, TUESDAY
}

// 有屬性的定義
enum StatusEnum {
    ENABLE("1", "啟用"), DISABLE("0", "禁用");

    private String code;

    private String name;

    StatusEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
}

枚舉編譯后實(shí)際上繼承了java.lang.Enum這個(gè)類(lèi),后面詳細(xì)講解,我們看下這個(gè)類(lèi)的關(guān)鍵方法:

  • static Enum valueOf(Class enumClass, String name)

返回指定名字、給定類(lèi)的枚舉常量

  • String toString()

返回枚舉常量名

  • int ordinal()

返回枚舉常量在enum中的位置,從0開(kāi)始

  • int compareTo(E other)

如果枚舉場(chǎng)景出現(xiàn)在other之前,則返回一個(gè)負(fù)值,如果this == other,則返回0,否則返回正值。

public static void main(String[] args) {
        // 根據(jù)字符串獲取枚舉
        StatusEnum enable = Enum.valueOf(StatusEnum.class, "ENABLE");
        System.out.println(enable);
        //枚舉比較直接用==
        System.out.println(enable == StatusEnum.ENABLE);

        // values方法獲取所有的枚舉
        StatusEnum[] values = StatusEnum.values();
        for (StatusEnum statusEnum : values) {
            // 打印枚舉的位置
            System.out.println(statusEnum.ordinal());
        }
    }

運(yùn)行結(jié)果:

圖片

枚舉的本質(zhì)

枚舉的本質(zhì)其實(shí)是一個(gè)類(lèi),繼承了java.lang.Enum這個(gè)類(lèi)。我們可以用idea的插件看下生成的字節(jié)碼如下:

  1. 繼承了java.lang.Enum

圖片

  1. ENABLE、DISABLE最終轉(zhuǎn)換為靜態(tài)字段,類(lèi)型其實(shí)StatusEnum這個(gè)類(lèi)

圖片

  1. 類(lèi)加載的時(shí)候初始化ENABLE、DISABLE這兩個(gè)屬性。

圖片

方法是類(lèi)加載的初始化階段就是執(zhí)行的,它這里的主要邏輯就是創(chuàng)建了兩個(gè)對(duì)象,設(shè)置到ENABLE,DISABLE上。

這下你明白枚舉是怎么一會(huì)事情了吧。

枚舉常見(jiàn)用途

枚舉創(chuàng)建單例

枚舉可以作為單例模式的最佳方式,能夠保證單例對(duì)象的唯一性。

public class User {
    //私有化構(gòu)造函數(shù)
    private User(){ }

    //定義一個(gè)靜態(tài)枚舉類(lèi)
    static enum SingletonEnum{
        //創(chuàng)建一個(gè)枚舉對(duì)象,該對(duì)象天生為單例
        INSTANCE;
        private User user;
        //私有化枚舉的構(gòu)造函數(shù)
        private SingletonEnum(){
            user = new User();
        }
        public User getInstnce(){
            return user;
        }
    }

    //對(duì)外暴露一個(gè)獲取User對(duì)象的靜態(tài)方法
    public static User getInstance(){
        return SingletonEnum.INSTANCE.getInstnce();
    }
}
  • 枚舉INSTANCE會(huì)在類(lèi)加載初始化的時(shí)候創(chuàng)建,而Java類(lèi)的加載和初始化過(guò)程都是線程安全的。
  • 枚舉可避免反序列化破壞單例。

枚舉抽象方法

枚舉類(lèi)可以定義抽象方法,然后讓各個(gè)具體的枚舉實(shí)現(xiàn),可以通過(guò)枚舉實(shí)現(xiàn)不同的策略實(shí)現(xiàn)。

enum OperEnum {
    ADD(1, 2) {
        @Override
        public Integer operate() {
            return this.getA() + this.getB();
        }
    }, MULTIPY(1, 2) {
        @Override
        public Integer operate() {
            return this.getA() * this.getB();
        }
    };

    private Integer a;

    private Integer b;

    OperEnum(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }

    public abstract Integer operate();

    public Integer getA() {
        return a;
    }

    public void setA(Integer a) {
        this.a = a;
    }

    public Integer getB() {
        return b;
    }

    public void setB(Integer b) {
        this.b = b;
    }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2967

    瀏覽量

    104758
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20095
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中枚舉的基本概念和常見(jiàn)用法

    在C語(yǔ)言中,枚舉是一種方便組織和表示一組相關(guān)常量的工具。枚舉類(lèi)型有助于提高代碼的可讀性和可維護(hù)性。本文將介紹C語(yǔ)言枚舉的基本概念、語(yǔ)法和用法,以及一些高級(jí)技巧。
    發(fā)表于 08-17 15:32 ?1467次閱讀

    Java多線程的用法

    本文將介紹一下Java多線程的用法。 基礎(chǔ)介紹 什么是多線程 指的是在一個(gè)進(jìn)程同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程都可以獨(dú)立執(zhí)行不同的任務(wù)或操作。 與單線程相比,多線程可以提高程序的并發(fā)性和響應(yīng)
    的頭像 發(fā)表于 09-30 17:07 ?953次閱讀

    智能五筆:另類(lèi)用法技巧知道嗎?

    智能五筆:另類(lèi)用法技巧知道嗎? 智能五筆是很多朋友都喜歡使用的一種五筆輸入法,不過(guò)如果只是將其作為一款普通的輸入法來(lái)使用的話,那
    發(fā)表于 02-24 13:49 ?658次閱讀

    深入理解java枚舉類(lèi)型enum用法

    enum 的全稱(chēng)為 enumeration, 是 JDK 1.5 引入的新特性,存放在 java.lang 包。 下面是我在使用 enum 過(guò)程的一些經(jīng)驗(yàn)和總結(jié)。 原始的接口定義
    發(fā)表于 09-27 11:49 ?0次下載

    java并發(fā)編程實(shí)戰(zhàn)之輔助類(lèi)用法

    Java并發(fā)編程:CountDownLatch、CyclicBarrier和Semaphore2017-09-18 13:07程序設(shè)計(jì)/58 在java 1.5,提供了一些非常有用的輔助類(lèi)來(lái)幫助
    發(fā)表于 09-27 16:50 ?0次下載

    基于STM32的多種printf用法 知道嗎?

    基于STM32的多種printf用法,知道嗎?
    的頭像 發(fā)表于 02-29 17:02 ?4489次閱讀

    go語(yǔ)言枚舉類(lèi)型怎么用

    、 java 等,都有原生支持。在 go ,大家卻找不到 enum 或者其它直接用來(lái)聲明枚舉類(lèi)型的關(guān)鍵字。從熟悉其它編程語(yǔ)言的開(kāi)發(fā)者轉(zhuǎn)用 go 編程,剛開(kāi)始會(huì)比較難接受這種情況。其實(shí),如果
    的頭像 發(fā)表于 09-02 09:43 ?5184次閱讀

    示波器的這些安全操作知道嗎?

    示波器的這些安全操作知道嗎?示波器維修。很多人都知道示波器是用來(lái)干什么的,也知道示波器都有哪些種類(lèi)和品牌,當(dāng)然也
    發(fā)表于 11-05 11:19 ?1698次閱讀

    SystemVerilog枚舉類(lèi)型的使用建議

    SystemVerilog枚舉類(lèi)型雖然屬于一種“強(qiáng)類(lèi)型”,但是枚舉類(lèi)型還是提供了一些“不正經(jīng)”的用法可以實(shí)現(xiàn)一些很常見(jiàn)的功能,本文將示例一些在枚舉
    的頭像 發(fā)表于 09-01 14:20 ?1719次閱讀

    如何正確區(qū)分Javasuper函數(shù)用法

    Javasuper函數(shù)有很多方法,在使用的時(shí)候我們應(yīng)該如何正確區(qū)分? 2 方法 三種用法: 訪問(wèn)父類(lèi)的方法。 調(diào)用父類(lèi)構(gòu)造方法。 訪問(wèn)父類(lèi)的隱藏成員變
    的頭像 發(fā)表于 02-21 15:08 ?570次閱讀

    Java創(chuàng)建對(duì)象有哪些方式

    1 問(wèn)題 作為Java開(kāi)發(fā)者,經(jīng)常創(chuàng)建很多對(duì)象,是否知道Java創(chuàng)建對(duì)象有哪些方式呢?
    的頭像 發(fā)表于 02-24 10:29 ?1053次閱讀

    Java枚舉的特點(diǎn)及用法

    Java 枚舉出現(xiàn)之前,通常會(huì)使用常量類(lèi)來(lái)表示一組固定的常量值,直到Java 1.5之后推出了枚舉,那么枚舉類(lèi)型有哪些特點(diǎn),它比常量類(lèi)又
    的頭像 發(fā)表于 09-30 10:02 ?1452次閱讀

    javaobj類(lèi)型的實(shí)戰(zhàn)用法

    類(lèi)型具有許多實(shí)戰(zhàn)用法,下面將詳細(xì)介紹一些常見(jiàn)的使用場(chǎng)景。 作為方法參數(shù)和返回值的類(lèi)型 在Java,可以使用obj類(lèi)型作為方法的參數(shù)或返回值類(lèi)型。這種用法可以使方法具有更廣泛的適用性,
    的頭像 發(fā)表于 11-21 10:27 ?773次閱讀

    java switch case值能為枚舉值嗎

    Java的switch語(yǔ)句可以接受枚舉類(lèi)型的值作為參數(shù)。在Java,枚舉是一種特殊的數(shù)據(jù)類(lèi)型
    的頭像 發(fā)表于 11-30 14:41 ?5403次閱讀

    Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)

    作者:京東物流 楊唯一 一、Java 枚舉類(lèi) Java 枚舉是一個(gè)特殊的類(lèi),一般表示一組常量,比如一年的 4 個(gè)季節(jié),一年的 12 個(gè)月份,一個(gè)星期的 7 天,方向有東南西北等。 我們
    的頭像 發(fā)表于 11-21 14:06 ?212次閱讀