欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java枚舉類使用場景及實(shí)例解析

 更新時間:2020年04月07日 09:37:11   作者:Chsoul''S Blog  
這篇文章主要介紹了Java枚舉類使用場景及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

為什么要用枚舉類

什么場景會用到枚舉,比如在表示一周的某一天,一年中的四季,這樣一組常量的時候我們會用到枚舉。在Java引入枚舉類之前常用一組int常量來表示枚舉,這種方式稱為int枚舉模式(int enum pattern)。

private static final int MONDAY = 1;
private static final int TUESDAY = 2;
private static final int WEDNESDAY = 3;
private static final int THURSDAY = 4;

private static final int CODE_START = 1;
private static final int CODE_STATUS = 2;
private static final int CODE_STOP = 3;

這種我們非常習(xí)慣的模式其實(shí)存在著很多不足和問題,

  • int枚舉組不具備命名空間的能力,當(dāng)表示具有相同命名常量時,需要添加前綴避免沖突
  • int表示的枚舉值不具有描述性,需要遍歷判斷具體的值并添加描述
  • int枚舉模式不具有安全性,此外int類型是編譯時常量,如果與int枚舉常量關(guān)聯(lián)的值發(fā)生變化,必須重新編譯,不重新編譯雖然不影響運(yùn)行,但是準(zhǔn)確性已經(jīng)不能保證

即便是升級為用String來表示枚舉值,String枚舉模式(String enum pattern),但這樣同樣存在其他問題,

初學(xué)者容易直接把字符串常量硬編碼到代碼中,不使用對應(yīng)的常量字段(filed)名,一旦書寫錯誤,編譯器無法檢查,但在運(yùn)行時會報出異常

String枚舉模式會存在一定的性能問題,涉及到字符串的比較操作

因此Java引入了枚舉類型解決int和String枚舉模式帶來的諸多不足,枚舉類型保證了編譯時的類型安全,枚舉類型有自己獨(dú)立的命名空間,枚舉類型便于擴(kuò)展,可以添加方法和域?qū)崿F(xiàn)其他的外部接口。

如何使用枚舉類

創(chuàng)建枚舉類

Java中枚舉是一種特殊的引用類型,是類(Class)的一種,JDK1.5中開始引入枚舉類型,在Java中使用enum關(guān)鍵字來聲明枚舉類,枚舉類編譯后默認(rèn)繼承了java.lang.Enum,因此枚舉類不能在繼承其他類,枚舉一般用來聲明某一特定類型的有窮集合,如用枚舉表示四季

public enum Season {
  SPRING,SUMMER,FALL,WINTER
}

枚舉類API

參考JDK api 1.8.CHM,可以看到枚舉類的常用api如下:

name public final String name()

返回此枚舉常量的名稱,與其枚舉聲明中聲明的完全相同。 大多數(shù)程序員應(yīng)該使用toString()方法,因?yàn)閠oString方法可能會返回一個更加用戶友好的名稱。 該方法主要用于專門的情況,其中正確性取決于獲得確切的名稱,這從發(fā)布到發(fā)布不會有所不同。

ordinal public final int ordinal()

返回此枚舉常數(shù)的序數(shù)(其枚舉聲明中的位置,其中初始常數(shù)的序數(shù)為零)。 大多數(shù)程序員將不會使用這種方法。 它被設(shè)計為使用復(fù)雜的基于枚舉的數(shù)據(jù)結(jié)構(gòu),如EnumSet和EnumMap 。

toString public String toString()

返回聲明中包含的此枚舉常量的名稱。 該方法可以被覆蓋,盡管它通常不是必需或不可取的。 當(dāng)一個更“程序員友好”的字符串形式存在時,枚舉類型應(yīng)該覆蓋此方法。

重寫: toString 在 Object

compareTo public final int compareTo(E o)

將此枚舉與指定的對象進(jìn)行比較以進(jìn)行訂購。 返回一個負(fù)整數(shù),零或正整數(shù),因?yàn)樵搶ο笮∮冢扔诨虼笥谥付▽ο蟆?枚舉常數(shù)僅與相同枚舉類型的其他枚舉常量相當(dāng)。 該方法實(shí)現(xiàn)的自然順序是聲明常量的順序。

Specified by: compareTo 在界面Comparable<E extends Enum<E>

參數(shù) :o - 要比較的對象。

結(jié)果 :負(fù)整數(shù),零或正整數(shù),因?yàn)樵搶ο笮∮?,等于或大于指定對象?/p>

getDeclaringClass public final Class<E> getDeclaringClass()

返回與此枚舉常量的枚舉類型相對應(yīng)的Class對象。 當(dāng)且僅當(dāng)e1.getDeclaringClass()== e2.getDeclaringClass())時,兩個枚舉常量e1和e2具有相同的枚舉類型。 (此方法返回的值可能與使用常量特定類體的枚舉常數(shù)Object.getClass()方法返回的值不同)

結(jié)果:該類對象對應(yīng)于此枚舉常量的枚舉類型

valueOf public static <T extends Enum<T>> T valueOf(Class <T> enumType,String name)

返回具有指定名稱的指定枚舉類型的枚舉常量。 該名稱必須與用于聲明此類型的枚舉常量的標(biāo)識符完全一致。 (不允許使用外來空白字符。)
請注意,對于特定枚舉類型T ,可以使用該枚舉上隱式聲明的public static T valueOf(String)方法,而不是使用此方法將名稱映射到

相應(yīng)的枚舉常量。 枚舉類型的所有常量可以通過調(diào)用該類型的隱式public static T[] values()方法來獲得。

values

此方法并未在API中提供,返回枚舉類型所有對象實(shí)例,返回值枚舉類型的數(shù)組。

枚舉應(yīng)用案例

上面簡單描述了如何聲明一個枚舉類,這里結(jié)合實(shí)際應(yīng)用場景描述枚舉的其他用法

單例設(shè)計模式

說到單例模式很多人會比較熟悉懶漢、餓漢等常見的單例書寫模式,用枚舉表示枚舉還是比較少見的,對于單例設(shè)計模式的多種寫法,單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。首先回顧下單例設(shè)計模式要求滿足的特點(diǎn):

  • 構(gòu)造方法私有化;
  • 實(shí)例化的變量引用私有化;
  • 獲取實(shí)例的方法共有。
public enum Singleton {
  INSTANCE;
  public Singleton getInstance(){
    return INSTANCE;
  }
}

使用枚舉方式創(chuàng)建單例的好處:

  • 避免反射攻擊
  • 避免序列化問題

有窮對象集合

枚舉類型中的構(gòu)造器默認(rèn)私有化,只能添加private修飾或者不添加

枚舉類型中定義的抽象方法必須被所有常量中的具體方法所覆蓋,特定于常量的方法實(shí)現(xiàn)可以結(jié)合特定于常量的數(shù)據(jù)結(jié)合起來

用枚舉表示加減乘除的操作

public enum Operation {
  PLUS("+","加法"){
    public double apply(double x,double y){
      return x + y;
    }
  },
  MINUS("-","減法"){
    public double apply(double x,double y){
      return x - y;
    }
  },
  TIMES("*","乘法"){
    public double apply(double x,double y){
      return x * y;
    }
  },
  DIVIDE("/","除法"){
    public double apply(double x,double y){
      return x / y;
    }
  };

  private final String symbol;
  private final String operName;

  public String getSymbol() {
    return symbol;
  }
  public String getOperName() {
    return operName;
  }
  Operation(String symbol, String operName){
    this.symbol = symbol;
    this.operName = operName;
  }
  public abstract double apply(double x,double y);
}

調(diào)用枚舉中的方法

public class TestOpera {
  public static void main(String[] args) {
    double x = 1;
    double y = 1;
    for(Operation operate : Operation.values()){
      System.out.println(
      operate.getOperName()+":"+x+operate.getSymbol()+y+" = "+operate.apply(x,y)
      );
    }
  }
}

輸出結(jié)果

加法:1.0 + 1.0 = 2.0
減法:1.0 - 1.0 = 0.0
乘法:1.0 * 1.0 = 1.0
除法:1.0 / 1.0 = 1.0

引入枚舉類型,不僅可以描述枚舉本身,還可以添加描述性字符串,甚至給每個對象添加結(jié)合特有常量的行為,也不用考慮其他安全性為題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中instanceOf關(guān)鍵字的用法及特性詳解

    Java中instanceOf關(guān)鍵字的用法及特性詳解

    當(dāng)我們在進(jìn)行向下轉(zhuǎn)型時,如果兩個對象之間沒有直接或間接的繼承關(guān)系,在轉(zhuǎn)換時有可能會產(chǎn)生強(qiáng)制類型轉(zhuǎn)換異常,我們可以使用java中自帶的instanceOf關(guān)鍵字來解決這個問題,所以本篇文章,會帶大家學(xué)習(xí)instanceOf的用法及特性,需要的朋友可以參考下
    2023-05-05
  • Spring Cloud Netflix架構(gòu)淺析(小結(jié))

    Spring Cloud Netflix架構(gòu)淺析(小結(jié))

    這篇文章主要介紹了Spring Cloud Netflix架構(gòu)淺析(小結(jié)),詳解的介紹了Spring Cloud Netflix的概念和組件等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 使用MUI框架構(gòu)建App請求http接口實(shí)例代碼

    使用MUI框架構(gòu)建App請求http接口實(shí)例代碼

    下面小編就為大家分享一篇使用MUI框架構(gòu)建App請求http接口實(shí)例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Spring Boot集成Java DSL的實(shí)現(xiàn)代碼

    Spring Boot集成Java DSL的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Spring Boot集成Java DSL的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 一篇文章教你將JAVA的RabbitMQz與SpringBoot整合

    一篇文章教你將JAVA的RabbitMQz與SpringBoot整合

    這篇文章主要介紹了如何將JAVA的RabbitMQz與SpringBoot整合,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • Java8 forEach常用場景代碼實(shí)例

    Java8 forEach常用場景代碼實(shí)例

    這篇文章主要介紹了Java8 forEach常用場景代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java方法通用返回結(jié)果集封裝操作

    java方法通用返回結(jié)果集封裝操作

    這篇文章主要介紹了java方法通用返回結(jié)果集封裝操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java流程控制break和continue

    Java流程控制break和continue

    這篇文章主要介紹了Java流程控制break和continue,下面文章圍繞break和continue的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2021-12-12
  • Java處理多API請求的方法詳解

    Java處理多API請求的方法詳解

    Java?中的并發(fā)是指語言并行運(yùn)行多個線程的能力,允許同時執(zhí)行多個任務(wù),
    2023-10-10
  • SpringBoot攔截器使用精講

    SpringBoot攔截器使用精講

    攔截器可以根據(jù) URL 對請求進(jìn)行攔截,主要應(yīng)用于登陸校驗(yàn)、權(quán)限驗(yàn)證、亂碼解決、性能監(jiān)控和異常處理等功能上。SpringBoot同樣提供了攔截器功能。 本文將為大家詳細(xì)介紹一下
    2021-12-12

最新評論