2007年7月23日 星期一

Java 學習筆記 (5) - Enumerated Type

Enumerated Type 的基本使用方式

Enumerated Type 有以下特性存在:
  1. public
    除非在 class 內部中宣告其為 private,否則就會是 public
  2. static
    可透過 Enumerated Type 名稱直接使用
  3. final
    不可改變


Enumerated Type(列舉型態) 的使用方式:

使用外部檔案定義 Enumerated Type

Action.java (Enumerated Type 設定檔)
public enum Action {
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
EnumDemo.java
public class EnumDemo {
public static void main(String[] args) {
doAction(Action.TURN_RIGHT);
}

//此傳入的參數型態為 "Action" enumerated type
public static void doAction(Action action) {
switch(action) {
case TURN_LEFT:
System.out.println("向左轉");
break;
case TURN_RIGHT:
System.out.println("向右轉");
break;
case SHOOT:
System.out.println("射擊");
break;
}
}
}

直接在 class 內部定義 Enumerated Type

用此種方式定義 Enumerated Type,則是將 Enumerated Type 視為 inner class 來使用,因此若是用以下範例,編譯後會有 EnumDemo2$InnerAction.class 這個檔案出現。

public class EnumDemo2 {
private enum InnerAction {TURN_LEFT, TURN_RIGHT, SHOOT};

public static void main(String[] args) {
doAction(InnerAction.TURN_RIGHT);
}

public static void doAction(InnerAction action) {
switch(action) {
case TURN_LEFT:
System.out.println("向左轉");
break;
case TURN_RIGHT:
System.out.println("向右轉");
break;
case SHOOT:
System.out.println("射擊");
break;
}
}
}

列出 Enumerated Type 中的成員

public class EnumIndex {
public static void main(String[] args) {
for(Action action: Action.values())
System.out.println(action.ordinal() + " " + action);
}
}


定義 method 或 constructor 至 Enumerated Type 中

定義 method

DetailAction.java
public enum DetailAction {
TURN_LEFT, TURN_RIGHT, SHOOT;

public String getDescription() {
switch(this.ordinal()) {
case 0:
return "向左轉";
case 1:
return "向右轉";
case 2:
return "射擊";
default:
return null;
}
}
}
DetailActionDemo.java
public class DetailActionDemo {
public static void main(String[] args) {
for(DetailAction action : DetailAction.values())
System.out.println(action + ":" + action.getDescription());
}
}

定義 constructor

DetailAction2.java
public enum DetailAction2 {
TURN_LEFT("向左轉"), TURN_RIGHT("向右轉"), SHOOT("射擊");

private String description;

//使用 constructor 來指定 description 的值
//上面三筆資料就是以這個 constructor 所指定進來而產生相對應的結果
private DetailAction2(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}
使用這個 Enumerated Type 時,只要將 DetailActionDemo.java 中的「DetailAction」改為「DetailAction2」即可。

沒有留言:

張貼留言