首頁 > Java > java教程 > 主體

Java中enum的使用方法介紹

黄舟
發布: 2017-09-20 10:15:35
原創
1772 人瀏覽過

這篇文章主要介紹了java 中enum的使用方法詳解的相關資料,希望透過本文能幫助到大家,理解掌握java 中enum的使用方法,需要的朋友可以參考下

java 中enum的使用方法詳解

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

以下是我在使用 enum 過程中的一些經驗和總結。

原始的介面定義常數


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

語法(定義)

創建枚舉型別要使用enum 關鍵字,隱含了所建立的型別都是java.lang.Enum 類別的子類別(java.lang.Enum 是抽象類別)。枚舉型別符合通用模式Class Enum


package com.hmw.test;
/**
 * 枚举测试类
 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a>
 */
public enum EnumTest {
  MON, TUE, WED, THU, FRI, SAT, SUN;
}
登入後複製

這段程式碼實際上呼叫了7次Enum(String name, int ordinal):


#
new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
  ... ...
登入後複製

遍歷、switch 等常用操作

對enum進行遍歷和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;
    }
  }
}
登入後複製

輸出結果:


MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二
登入後複製

enum 物件的常用方法介紹

int compareTo(E o)

比較此枚舉與指定物件的順序。

Class getDeclaringClass()

傳回與此枚舉常數的枚舉類型相對應的 Class 物件。

String name()

傳回此枚舉常數的名稱,並在其枚舉宣告中對其進行宣告。

int ordinal()

傳回枚舉常數的序數(它在枚舉宣告中的位置,其中初始常數序數為零)。

String toString()

傳回枚舉常數的名稱,它包含在宣告中。

static


/**
 * Java学习交流QQ群:589809992 我们一起学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());
  }
}
登入後複製

輸出結果:


TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
登入後複製

給enum 自訂屬性和方法

給enum 物件加一下value 的屬性和getValue() 的方法:


package com.hmw.test;

/**
 * 枚举测试类
 * 
 * @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());
  }
}
登入後複製

輸出結果:


EnumTest.FRI 的 value = 5
登入後複製

EnumSet,EnumMap 的應用


/**
 * Java学习交流QQ群:589809992 我们一起学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 的語法結構儘管和class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class檔。該class檔案經過反編譯可以看到實際上是產生了一個類,該類別繼承了java.lang.Enum。 EnumTest 經過反編譯(javap com.hmw.test.EnumTest 指令)之後得到的內容如下:############
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);
}
登入後複製
###所以,實際上enum 就是一個class,只不過java 編譯器幫我們做了語法的解析和編譯而已。 #########總結#########可以把enum 看成是一個普通的class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用extends 關鍵字繼承其他類,因為enum 已經繼承了java.lang.Enum(java是單一繼承)。 ###

以上是Java中enum的使用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!