程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 馴服Tiger之深入研究枚舉類型

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

編輯:JAVA編程入門知識
基礎知識
  
  在J2SE1.5中通過使用新的 enum 要害字創建指定的對象集合,您可以創建一個枚舉類型。然後,可以將每個指定的值看作是那個類的一個實例,這為您提供了指定的整數集合所無法提供的編譯時類型安全。清單 1 將創建一個枚舉類型,並將類型安全的枚舉值作為幫助器方法(helper method)的參數。該枚舉類型的 values() 方法返回這種類型的不同值的有序數組。
  
  清單 1. 枚舉類型的例子
  
   public class Loop {
   enum Size {
  Small,
  Medium,
  Large
   }
   public static void main(String args[]) {
  for (Size s : Size.values()) {
   helper(s);
  }
   }
  
   private static void helper(Size s) {
  System.out.println("Size value: " + s);
   }
  }
  構造函數、方法和變量
  
  在使用 enum 要害字創建新的枚舉類型時,實際上是在創建 java.lang.Enum 類的子類,其中,枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 構造函數中,在這裡,每個值的名稱都被轉換成一個字符串,並且序數設置表示了每個設置的優先值。換句話說,enum Size {Small, Medium, Large} 將映射到清單 2 中所示的構造函數調用中:
  
  清單 2. 映射的構造函數調用
  
   new Enum<Size>("Small", 0);
  new Enum<Size>("Medium", 1);
  new Enum<Size>("Large", 2);
  不必將構造函數的使用限制為間接 Enum 構造函數調用。在使用 enum 要害字時,將創建 Enum 的子類。您可以使用參數和任何別的東西為定義的每個名稱添加一些您自己的構造函數調用。名稱聲明可以看作是對構造函數的調用,您不必添加 new 要害字。這種方法答應您將數據作為參數值傳遞給構造函數調用,如清單 3 所示。該參數表示 Size 對象的枚舉集合的定價因子。位於枚舉類型定義之後的 main() 方法演示了這種用法。
  
  清單 3. 定制構造函數的例子
  
   public class Sample {
   enum Size {
  Small(0.8),
  Medium(1.0),
  Large(1.2);
  
  double pricingFactor;
  
  Size(double p) {
   pricingFactor = p;
  }
   }
   public static void main(String args[]) {
  Size s = Size.Large;
  double d = s.pricingFactor;
  System.out.println(s + " Size has pricing factor of " + d);
   }
  }
  運行該程序將返回給定 Size 的定價因子。您還可以定義一個類似於 getPricingFactor() 的方法,並將 pricingFactor 字段設置為 private,以便更多地將它作為類 JavaBean 的屬性對待。清單 4 給前面的例子添加了一個方法:
  
  清單 4. 方法的例子
  
   public class Sample2 {
   enum Size {
  Small(0.8),
  Medium(1.0),
  Large(1.2);
  
  private double pricingFactor;
  
  Size(double p) {
   pricingFactor = p;
  }
  
  public double getPricingFactor() {
   return pricingFactor;
  }
   }
   public static void main(String args[]) {
  Size s = Size.Large;
  double d = s.getPricingFactor();
  System.out.println(s + " Size has pricing factor of " + d);
   }
  }
  對於這兩種情況,輸出均為:
  
   Large Size has pricing factor of 1.2 QQRead.com 推出數據恢復指南教程 數據恢復指南教程 數據恢復故障解析 常用數據恢復方案 硬盤數據恢復教程 數據保護方法 數據恢復軟件 專業數據恢復服務指南 預定義的方法
  
  因為用戶定義的枚舉類型是 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 常量,該方法返回的值可能不同於 Object.getClass() 方法返回的值。
  
  接下來,我將解釋特定於常量的類主體。valueOf() 方法是靜態的,它答應您從類型的名稱中創建枚舉的值。
  
  特定於常量的類主體
  
  特定於常量的類主體是 enum 要害字的一個受支持的特性;不過,它們的使用應該受到嚴格的限制。這個概念正在深入到將枚舉類型的每個元素作為一個子類對待的領域。例如,在前面的例子中,Size 枚舉類型有一個定價因子參數和 getPricingFactor() 方法。但沒有構造函數參數,清單 5 展示了如何利用特定於常量的主體來做同樣的事。我們添加了一些額外的大小來讓這個例子更有趣些。在這裡,Small 的定價因子是 0.8,而 ExtraLarge 和 ExtraExtraLarge 的定價因子是 1.2。其余的大小則采用默認值,即 1.0。
  
  清單 5. 特定於常量的主體
  
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved