最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中枚舉的實現(xiàn)原理介紹

 更新時間:2021年12月14日 15:07:18   作者:恒生LIGHT云社區(qū)  
大家好,本篇文章主要講的是Java中枚舉的實現(xiàn)原理介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

基本概述

在 JDK1.5 之前,通過定義常量使用的都是:public static fianl。而枚舉的設(shè)計,就是把相關(guān)的常量分組到一個枚舉類型里,方便創(chuàng)建和管理。

比如我們要定義一個顏色常量:

public enum Colour {
    RED, YELLOW, BLUE, GREEN
}

這段代碼通過底層編譯后,實際創(chuàng)建了4個枚舉對象:

new Enum<EnumTest>("RED", 0);
new Enum<EnumTest>("YELLOW", 1);
new Enum<EnumTest>("BLUE", 2);
new Enum<EnumTest>("GREEN", 3);

使用方式

條件選擇

enum 能通過 switch 方法進行簡單條件判斷

Colour color = Colour.RED;
switch (color) {
    case RED:
        System.out.println("紅色");
        break;
    case YELLOW:
        System.out.println("黃色");
        break;
    case GREEN:
        System.out.println("綠色");
        break;
    case BLUE:
        System.out.println("藍色");
        break;
    default:
        System.out.println(color);
        break;
}

循環(huán)遍歷

通過循環(huán)遍歷 .values() 能夠取到對象中的值

for (Colour e : Colour.values()) {
    System.out.println(e.toString());
}

集合映射

在我們使用枚舉類型作為集合的類型或映射中的鍵的類型時,可以使用專門且高效的集合和映射實現(xiàn)。如: java.util.EnumSet 、 java.util.EnumMap

// EnumSet的使用
EnumSet<Colour> colorSet = EnumSet.allOf(Colour.class);
for (Colour color : colorSet) {
    System.out.println(color);
}

// EnumMap的使用
EnumMap<Colour, String> colorMap = new EnumMap(Colour.class);
colorMap.put(Colour.RED, "紅色");
colorMap.put(Colour.YELLOW, "黃色");
colorMap.put(Colour.GREEN, "綠色");
colorMap.put(Colour.BLUE, "藍色");

Set<Map.Entry<Colour, String>> colorEntries = colorMap.entrySet();
for (Map.Entry<Colour, String> entry : colorEntries) {
    System.out.println(entry.getKey().name() + ":" + entry.getValue());
}

常用方法

通過 java.lang.Enum 類的源碼,可以探索下枚舉常用的一些方法和設(shè)計思想:

// Enum 唯一的構(gòu)造函數(shù),由于 protected 修飾,所以不能調(diào)用這個構(gòu)造函數(shù)。 它供編譯器為響應(yīng)枚舉類型聲明而發(fā)出的代碼使用。
protected Enum(String name, int ordinal) {
    this.name = name;
    this.ordinal = ordinal;
}
```
// 返回此枚舉常量的名稱,與在其枚舉聲明中聲明的完全相同。
public final String name() {
    return name;
}
```
// 返回此枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量被分配零序數(shù))。(但大多數(shù)程序員不會使用這種方法)
public final int ordinal() {
    return ordinal;
}
```
// 與指定的對象進行比較以進行排序,當此對象小于、等于或大于指定對象時,返回一個負整數(shù)、零或正整數(shù)。且只能與相同枚舉類型的其他枚舉常量進行比較。 
public final int compareTo(E o) {
    Enum<?> other = (Enum<?>)o;
    Enum<E> self = this;
    if (self.getClass() != other.getClass() 
        self.getDeclaringClass() != other.getDeclaringClass())
        throw new ClassCastException();
    return self.ordinal - other.ordinal;
}
```
// 返回與此枚舉常量的枚舉類型對應(yīng)的 Class 對象。
public final Class<E> getDeclaringClass() {
    Class<?> clazz = getClass();
    Class<?> zuper = clazz.getSuperclass();
    return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
}
```
## 底層原理

`enum` 的語法結(jié)構(gòu)可能對于正常的 Java 看起來怪怪的,但是通過編譯器編譯后產(chǎn)生的是一個 `.class` 文件, 可以理解枚舉的語法結(jié)構(gòu)是一種規(guī)范,使編譯器能識別并轉(zhuǎn)化為相應(yīng)的類,底層實際上還是 `class` 。

```java
public class com.project.demo.Colour extends java.lang.Enum{
    public static final com.project.demo.Colour RED;
    public static final com.project.demo.Colour YELLOW;
    public static final com.project.demo.Colour BLUE;
    public static final com.project.demo.Colour GREEN;
    static {};
}

總結(jié)

所以 enum 實際上在 Java 只是一個類的形式存在,它能夠更加方便的幫助我們定義常量對象,并且支持定義屬性和方法,在一定程度上提高了我們的編程效率。

但是在使用時需要注意, enum 不能支持繼承,應(yīng)該它已經(jīng)繼承了包里的 java.lang.Enum 類,所以在程序設(shè)計時我們需要考慮到。

到此這篇關(guān)于Java中枚舉的實現(xiàn)原理介紹的文章就介紹到這了,更多相關(guān)Java枚舉實現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Zookeeper開源客戶端框架Curator

    淺談Zookeeper開源客戶端框架Curator

    這篇文章主要介紹了淺談Zookeeper開源客戶端框架Curator的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • java中對List分段操作的實例

    java中對List分段操作的實例

    這篇文章主要介紹了java中對List分段操作的實例的相關(guān)資料,希望通過本文大家能夠掌握list的分段實現(xiàn)方法,需要的朋友可以參考下
    2017-09-09
  • Java實現(xiàn)人機猜拳小游戲

    Java實現(xiàn)人機猜拳小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)人機猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Java?@Transactional指定回滾條件

    Java?@Transactional指定回滾條件

    這篇文章主要介紹了Java?@Transactional指定回滾條件,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • Java開發(fā)必備知識之數(shù)組詳解

    Java開發(fā)必備知識之數(shù)組詳解

    數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同.本篇文章為大家整理了Java最全關(guān)于數(shù)組的知識點,并給出其對應(yīng)的代碼,需要的朋友可以參考下
    2021-06-06
  • 解決mybatis-plus 查詢耗時慢的問題

    解決mybatis-plus 查詢耗時慢的問題

    這篇文章主要介紹了解決mybatis-plus 查詢耗時慢的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中main函數(shù)的String[]?args用法舉例詳解

    Java中main函數(shù)的String[]?args用法舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中main函數(shù)的String[]?args用法的相關(guān)資料,JAVA類中main函數(shù)的參數(shù)String[]?args指的是運行時給main函數(shù)傳遞的參數(shù),文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 基于Java代碼操作Redis過程詳解

    基于Java代碼操作Redis過程詳解

    這篇文章主要介紹了基于Java代碼操作Redis過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java rocketmq--消息的產(chǎn)生(普通消息)

    java rocketmq--消息的產(chǎn)生(普通消息)

    這篇文章主要介紹了java rocketmq--消息的產(chǎn)生(普通消息),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Java操作redis設(shè)置第二天凌晨過期的解決方案

    Java操作redis設(shè)置第二天凌晨過期的解決方案

    這篇文章主要介紹了Java操作redis設(shè)置第二天凌晨過期的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

和硕县| 东乡族自治县| 若羌县| 嘉荫县| 永和县| 丹凤县| 巴彦县| 庐江县| 聊城市| 河北区| 高清| 赤峰市| 黄骅市| 威信县| 响水县| 新蔡县| 水城县| 宜都市| 年辖:市辖区| 定日县| 拜城县| 永昌县| 恩施市| 浙江省| 海南省| 万载县| 涿鹿县| 南靖县| 五河县| 弥渡县| 崇阳县| 丁青县| 松溪县| 延吉市| 常熟市| 油尖旺区| 元朗区| 米脂县| 左云县| 屏东市| 海安县|