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

java 中enum的使用方法詳解

 更新時(shí)間:2017年09月19日 15:10:32   投稿:lqh  
這篇文章主要介紹了java 中enum的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,理解掌握java 中enum的使用方法,需要的朋友可以參考下

java 中enum的使用方法詳解

enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

下面是我在使用 enum 過程中的一些經(jīng)驗(yàn)和總結(jié)。

原始的接口定義常量

public interface IConstants {
  String MON = "Mon";
  String TUE = "Tue";
  String WED = "Wed";
  String THU = "Thu";
  String FRI = "Fri";
  String SAT = "Sat";
  String SUN = "Sun";
}

語法(定義)

創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個(gè)抽象類)。枚舉類型符合通用模式 Class Enum

package com.hmw.test;
/**
 * 枚舉測(cè)試類
 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a>
 */
public enum EnumTest {
  MON, TUE, WED, THU, FRI, SAT, SUN;
}

這段代碼實(shí)際上調(diào)用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
  ... ...

遍歷、switch 等常用操作

對(duì)enum進(jìn)行遍歷和switch的操作示例代碼:

public class Test {
  public static void main(String[] args) {
    for (EnumTest e : EnumTest.values()) {
      System.out.println(e.toString());
    }

    System.out.println("----------------我是分隔線------------------");

    EnumTest test = EnumTest.TUE;
    switch (test) {
    case MON:
      System.out.println("今天是星期一");
      break;
    case TUE:
      System.out.println("今天是星期二");
      break;
    // ... ...
    default:
      System.out.println(test);
      break;
    }
  }
}

輸出結(jié)果:

MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔線------------------
今天是星期二

enum 對(duì)象的常用方法介紹

int compareTo(E o)

比較此枚舉與指定對(duì)象的順序。

Class getDeclaringClass()

返回與此枚舉常量的枚舉類型相對(duì)應(yīng)的 Class 對(duì)象。

String name()

返回此枚舉常量的名稱,在其枚舉聲明中對(duì)其進(jìn)行聲明。

int ordinal()

返回枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量序數(shù)為零)。

String toString()

返回枚舉常量的名稱,它包含在聲明中。

static

/**
 * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java!
 */
public class Test {
  public static void main(String[] args) {
    EnumTest test = EnumTest.TUE;

    //compareTo(E o)
    switch (test.compareTo(EnumTest.MON)) {
    case -1:
      System.out.println("TUE 在 MON 之前");
      break;
    case 1:
      System.out.println("TUE 在 MON 之后");
      break;
    default:
      System.out.println("TUE 與 MON 在同一位置");
      break;
    }

    //getDeclaringClass()
    System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

    //name() 和 toString()
    System.out.println("name(): " + test.name());
    System.out.println("toString(): " + test.toString());

    //ordinal(), 返回值是從 0 開始
    System.out.println("ordinal(): " + test.ordinal());
  }
}

輸出結(jié)果:

TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1

給 enum 自定義屬性和方法

給 enum 對(duì)象加一下 value 的屬性和 getValue() 的方法:

package com.hmw.test;

/**
 * 枚舉測(cè)試類
 * 
 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a>
 */
public enum EnumTest {
  MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
    @Override
    public boolean isRest() {
      return true;
    }
  },
  SUN(0) {
    @Override
    public boolean isRest() {
      return true;
    }
  };

  private int value;

  private EnumTest(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }

  public boolean isRest() {
    return false;
  }
}
public class Test {
  public static void main(String[] args) {
    System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
  }
}

輸出結(jié)果:

EnumTest.FRI 的 value = 5

EnumSet,EnumMap 的應(yīng)用

/**
 * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java!
 */
public class Test {
  public static void main(String[] args) {
    // EnumSet的使用
    EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
    for (EnumTest day : weekSet) {
      System.out.println(day);
    }

    // EnumMap的使用
    EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
    weekMap.put(EnumTest.MON, "星期一");
    weekMap.put(EnumTest.TUE, "星期二");
    // ... ...
    for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
      Entry<EnumTest, String> entry = iter.next();
      System.out.println(entry.getKey().name() + ":" + entry.getValue());
    }
  }
}

原理分析

enum 的語法結(jié)構(gòu)盡管和 class 的語法不一樣,但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個(gè)class文件。該class文件經(jīng)過反編譯可以看到實(shí)際上是生成了一個(gè)類,該類繼承了java.lang.Enum。EnumTest 經(jīng)過反編譯(javap com.hmw.test.EnumTest 命令)之后得到的內(nèi)容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{
  public static final com.hmw.test.EnumTest MON;
  public static final com.hmw.test.EnumTest TUE;
  public static final com.hmw.test.EnumTest WED;
  public static final com.hmw.test.EnumTest THU;
  public static final com.hmw.test.EnumTest FRI;
  public static final com.hmw.test.EnumTest SAT;
  public static final com.hmw.test.EnumTest SUN;
  static {};
  public int getValue();
  public boolean isRest();
  public static com.hmw.test.EnumTest[] values();
  public static com.hmw.test.EnumTest valueOf(java.lang.String);
  com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}

所以,實(shí)際上 enum 就是一個(gè) class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。

總結(jié)

可以把 enum 看成是一個(gè)普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關(guān)鍵字繼承其他類,因?yàn)?enum 已經(jīng)繼承了 java.lang.Enum(java是單一繼承)。

 如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Spring中集成Groovy的四種方式(小結(jié))

    Spring中集成Groovy的四種方式(小結(jié))

    這篇文章主要介紹了Spring中集成Groovy的四種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring Boot 應(yīng)用程序中配置使用consul的方法

    Spring Boot 應(yīng)用程序中配置使用consul的方法

    配置是 Spring Boot 應(yīng)用程序中的一部分,主要用于配置服務(wù)端口、應(yīng)用名稱、Consul 服務(wù)發(fā)現(xiàn)以及健康檢查等功能,下面給大家介紹Spring Boot 應(yīng)用程序中配置使用consul,感興趣的朋友一起看看吧
    2025-04-04
  • spring security結(jié)合jwt實(shí)現(xiàn)用戶重復(fù)登錄處理

    spring security結(jié)合jwt實(shí)現(xiàn)用戶重復(fù)登錄處理

    本文主要介紹了spring security結(jié)合jwt實(shí)現(xiàn)用戶重復(fù)登錄處理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot整合MyBatis-Plus3.1教程詳解

    SpringBoot整合MyBatis-Plus3.1教程詳解

    這篇文章主要介紹了SpringBoot整合MyBatis-Plus3.1詳細(xì)教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類

    使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類

    這篇文章主要介紹了使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制

    Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制

    這篇文章主要介紹了Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制,鎖膨脹機(jī)制是提升?synchronized?性能最有利的方法之一,下面我們就來看看什么事鎖膨脹及鎖膨脹的各種細(xì)節(jié)
    2022-05-05
  • 圖解Java經(jīng)典算法歸并排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法歸并排序的原理與實(shí)現(xiàn)

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide?and?Conquer)的一個(gè)非常典型的應(yīng)用。本文將通過動(dòng)圖詳解歸并排序的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-09-09
  • spring中時(shí)間格式化的兩種方法示例講解

    spring中時(shí)間格式化的兩種方法示例講解

    這篇文章主要介紹了spring中時(shí)間格式化的兩種方法,方法一自己格式化,方法二通過配置,結(jié)合實(shí)例代碼講解的非常詳細(xì),文中補(bǔ)充介紹了Spring項(xiàng)目中時(shí)間格式化的方法,需要的朋友可以參考下
    2023-08-08
  • Java的枚舉enum示例詳解

    Java的枚舉enum示例詳解

    這篇文章主要給大家介紹了關(guān)于Java的枚舉enum的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java  hibernate使用注解來定義聯(lián)合主鍵

    java hibernate使用注解來定義聯(lián)合主鍵

    這篇文章主要介紹了java hibernate使用注解來定義聯(lián)合主鍵的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

SHOW| 孟津县| 乌拉特前旗| 波密县| 台东市| 黄陵县| 东乌珠穆沁旗| 郓城县| 盐津县| 新竹县| 鸡东县| 满洲里市| 泰顺县| 承德县| 沽源县| 邯郸市| 永顺县| 利辛县| 新绛县| 蓝田县| 友谊县| 桃园县| 泰和县| 崇礼县| 仙居县| 葵青区| 静乐县| 台州市| 西乡县| 平度市| 澄迈县| 长武县| 锡林郭勒盟| 乌拉特后旗| 渭源县| 阿尔山市| 富源县| 南皮县| 岳西县| 茌平县| 马鞍山市|