1.3.5 特定於常量的類主體
在上一節裡提到枚舉類型可以定義自己的函數,其實更進一步,枚舉類型的每一個值 都可以實現枚舉類型裡定義的抽象函數,這聽起來很不可思議,我們可以先看下面的例子 .
public enum Priority implements Feature {
High (38) {
public void perform() {
System.out.println("high 38");
}
},
Medium(36.5) {
public void perform() {
System.out.println("medium 36.5");
}
},
Low (5.2){
public void perform() {
System.out.println("low 5.2");
}
};
public abstract void perform();
public String getDescription(Priority p) {
return null;
}
}
枚舉類型Priority 定義了一個抽象函數perform(),Priority的每一個值都對perform 函數實現了重載,這就是枚舉類型的特定於常量的類主體.在這種情況下,每聲明一個值 ,枚舉類型的一個子類生成,然後生成這個子類的唯一的實例來表示這個值.不同的值, 就有對應的不同的子類.每個子類可以對父類的抽象函數進行重載.我們可以用下面的程序 在Eclipse3.1環境中運行來證明此時3個子類生成.
public class Task {
Priority myPriority;
public Task (Priority p) {
myPriority=p;
}
public Priority getPriority(){
return myPriority;
}
public void test() throws IOException {
if (myPriority == Priority.High)
System.out.println(Priority.High.getClass().getName());
if (myPriority == Priority.Medium)
System.out.println(Priority.Medium.getClass().getName());
if (myPriority == Priority.Low)
System.out.println(Priority.Low.getClass().getName());
}}
public class TestSwitch {
public static void main(String[] args) {
Task task = new Task(Priority.High);
Task task1 = new Task(Priority.Medium);
Task task2 = new Task(Priority.Low);
try {
task.test();
task1.test();
task2.test();
} catch (IOException e) {
e.printStackTrace();
}
}
運行結果如下圖10.
圖9 測試特定於常量的類主體運行結果
由於特定於常量的類主體難理解容易出錯,它的應用比較少,大多數情況下可以用 switch-case 語句替代. 在這裡簡單介紹,僅供參考.
1.4 枚舉類型的小結
使用枚舉類型是很簡單的.它定義一個固定的、封閉的值集合,然後,在需要這些值中 的某一個值時,可以通過它的名稱來指定它,這就是枚舉類型的簡單性.枚舉類型的值就 是枚舉類型的實例,編譯器會確保沒有傳入其他的類型,這就是枚舉類型的安全性.這些 枚舉類型就是類本身,因此,可以對類進行的所有操作同樣可以作用於枚舉類型上.我們 要小心使用構造函數和函數重載方法,不要因為這些特性可用就任意使用它們.比如特定 於常量的類主體,大多情況下可以用Switch語句來代替,更容易讓人理解而且不容易出錯 .我們也看到了Eclipse 3.1平台對枚舉類型的支持,包括提供創建模板,錯誤信息提示等 .總之,枚舉類型的靈活應用能極大的方便和簡化了我們的開發工作.