熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

馴服Tiger之深入研究枚舉類型

2013-11-15 11:48:02  來源: JSP教程 

  基礎知識
  
  在JSE中通過使用新的 enum 關鍵字創建指定的對象集合您可以創建一個枚舉類型然後可以將每個指定的值看作是那個類的一個實例這為您提供了指定的整數集合所無法提供的編譯時類型安全清單 將創建一個枚舉類型並將類型安全的枚舉值作為幫助器方法(helper method)的參數該枚舉類型的 values() 方法返回這種類型的不同值的有序數組
  
  清單 枚舉類型的例子
  
  public class Loop {
  enum Size {
  Small
  Medium
  Large
  }
  public static void main(String args[]) {
  for (Size s : Sizevalues()) {
  helper(s);
  }
  }
  
  private static void helper(Size s) {
  Systemoutprintln(Size value: + s);
  }
  }
  
  構造函數方法和變量
  
  在使用 enum 關鍵字創建新的枚舉類型時實際上是在創建 javalangEnum 類的子類其中枚舉類型符合通用模式 Class Enum<E extends Enum<E>>而 E 表示枚舉類型的名稱枚舉類型的每一個值都將映射到 protected Enum(String name int ordinal) 構造函數中在這裡每個值的名稱都被轉換成一個字符串並且序數設置表示了每個設置的優先值換句話說enum Size {Small Medium Large} 將映射到清單 中所示的構造函數調用中
  
  清單 映射的構造函數調用
  
  new Enum<Size>(Small );
  new Enum<Size>(Medium );
  new Enum<Size>(Large );
  
  不必將構造函數的使用限制為間接 Enum 構造函數調用在使用 enum 關鍵字時將創建 Enum 的子類您可以使用參數和任何別的東西為定義的每個名稱添加一些您自己的構造函數調用名稱聲明可以看作是對構造函數的調用您不必添加 new 關鍵字這種方法允許您將數據作為參數值傳遞給構造函數調用如清單 所示該參數表示 Size 對象的枚舉集合的定價因子位於枚舉類型定義之後的 main() 方法演示了這種用法
  
  清單 定制構造函數的例子
  
  public class Sample {
  enum Size {
  Small()
  Medium()
  Large();
  
  double pricingFactor;
  
  Size(double p) {
  pricingFactor = p;
  }
  }
  public static void main(String args[]) {
  Size s = SizeLarge;
  double d = spricingFactor;
  Systemoutprintln(s + Size has pricing factor of + d);
  }
  }
  
  運行該程序將返回給定 Size 的定價因子您還可以定義一個類似於 getPricingFactor() 的方法並將 pricingFactor 字段設置為 private以便更多地將它作為類 JavaBean 的屬性對待清單 給前面的例子添加了一個方法
  
  清單 方法的例子
  
  public class Sample {
  enum Size {
  Small()
  Medium()
  Large();
  
  private double pricingFactor;
  
  Size(double p) {
  pricingFactor = p;
  }
  
  public double getPricingFactor() {
  return pricingFactor;
  }
  }
  public static void main(String args[]) {
  Size s = SizeLarge;
  double d = sgetPricingFactor();
  Systemoutprintln(s + Size has pricing factor of + d);
  }
  }
  
  對於這兩種情況輸出均為
  
  Large Size has pricing factor of
  
  預定義的方法
  
  因為用戶定義的枚舉類型是 Enum 類型的子類所以您需要繼承用於您的類型的那個類的所有方法下面列出了完整的方法集合(E 表示枚舉類型自身)
  
  public int compareTo(E e)
  public boolean equals(Object o)
  public final Class<E> getDeclaringClass()
  public int hashCode()
  public String name()
  public int ordinal()
  public String toString()
  public static <T extends Enum<T>> T valueOf(Class<T> enumType String name)
  
  一些方法看起來很熟悉而其他一些方法則是特定於 Enum 類的compareTo()equals() 和 hashCode() 方法是典型的 Object 和 Comparable 方法其中compareTo() 報告聲明元素的順序name() 和 ordinal() 方法返回構造函數參數而 toString() 返回名稱
  
  getDeclaringClass() 和 valueOf() 方法需要稍多一些解釋getDeclaringClass() 方法類似於 Object 的 getClass() 方法但它沒必要返回相同的類根據這個方法的 Javadoc 的說明
  
  對於具有特定於常量的類主體的 enum 常量該方法返回的值可能不同於 ObjectgetClass() 方法返回的值
  
  接下來我將解釋特定於常量的類主體valueOf() 方法是靜態的它允許您從類型的名稱中創建枚舉的值
  
  特定於常量的類主體
  
  特定於常量的類主體是 enum 關鍵字的一個受支持的特性不過它們的使用應該受到嚴格的限制這個概念正在深入到將枚舉類型的每個元素作為一個子類對待的領域例如在前面的例子中Size 枚舉類型有一個定價因子參數和 getPricingFactor() 方法但沒有構造函數參數清單 展示了如何利用特定於常量的主體來做同樣的事我們添加了一些額外的大小來讓這個例子更有趣些在這裡Small 的定價因子是 而 ExtraLarge 和 ExtraExtraLarge 的定價因子是 其余的大小則采用默認值
  
  清單 特定於常量的主體
  
  public class Sample {
  enum Size {
  Small {
  public double getPricingFactor() {
  return ;
  }
  }
  Medium
  Large
  ExtraLarge {
  public double getPricingFactor() {
  return ;
  }
  }
  ExtraExtraLarge {
  public double getPricingFactor() {
  return ;
  }
  };
  
  public double getPricingFactor() {
  return ;
  }
  }
  public static void main(String args[]) {
  for (Size s : Sizevalues()) {
  double d = sgetPricingFactor();
  Systemoutprintln(s + Size has pricing factor of + d);
  }
  }
  }
  
  如果回頭想想前面描述過的 getDeclaringClass() 方法您就能明白為什麼這些特定於常量的主體和 getClass() 能夠在擁有特定於常量的類主體的同時返回不同的類
  
  EnumMap 和 EnumSet
  
  javautil 程序包中包含兩個類EnumMap 和 EnumSet這兩個類有助於使處理枚舉類型變得更容易一些EnumMap 類提供了 javautilMap 接口的一個特殊實現該接口中的鍵(key)是一個枚舉類型EnumSet 類提供了 javautilSet 接口的實現該接口保存了某種枚舉類型的值的集合
  
  清單 展示了 EnumMap 類的用法在創建映射時必須為枚舉的鍵傳入這個類
  
  清單 EnumMap 的例子
  
  import javautil*;
  
  public class EnumMapSample {
  enum Size {
  Small
  Medium
  Large;
  }
  public static void main(String args[]) {
  Map<Size Double> map = new EnumMap<Size Double>(Sizeclass);
  mapput(SizeSmall );
  mapput(SizeMedium );
  mapput(SizeLarge );
  
  for (MapEntry<Size Double> entry : mapentrySet()) {
  helper(entry);
  }
  }
  
  private static void helper(MapEntry<Size Double> entry) {
  Systemoutprintln(Map entry: + entry);
  }
  }
  
  枚舉集合的作用類似於特性的集合或者類似於某個枚舉類型的所有元素的值的子集EnumSet 類擁有以下一系列的靜態方法可以用這些方法從枚舉類型中獲取單個元素
  
  public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)
  public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s)
  public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c)
  public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
  public static <E extends Enum<E>> EnumSet<E> of(E e)
  public static <E extends Enum<E>> EnumSet<E> of(E first E rest)
  public static <E extends Enum<E>> EnumSet<E> of(E e E e)
  public static <E extends Enum<E>> EnumSet<E> of(E e E e E e)
  public static <E extends Enum<E>> EnumSet<E> of(E e E e E e E e)
  public static <E extends Enum<E>> EnumSet<E> of(E e E e E e E e E e)
  public static <E extends Enum<E>> EnumSet<E> range(E from E to)
  
  一旦創建了 EnumSet就可以像對待其他任何 Set 對象那樣對待這組對象
  
  結束語
  
  使用枚舉
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19642.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.