From Gossip@caterpillar

Java Gossip: 列舉上的方法

定義列舉型態基本上就像是在定義類別,定義列舉型態時您也可以加入方法(Method),例如,您也許會想要為列 舉值加上一些描述,而不是使用預設的toString()返回值來描述它。
  • OpConstants.java
public enum OpConstants {
TURN_LEFT, TURN_RIGHT, SHOOT;

public String getDescription() {
switch(this.ordinal()) {
case 0:
return "向左轉";
case 1:
return "向右轉";
case 2:
return "射擊";
default:
return null;
}
}
}

您可以使用下面這個程式來測試一下:
  • ShowEnum.java
public class ShowEnum {
public static void main(String[] args) {
for(OpConstants c : OpConstants.values()) {
System.out.printf("%s%n\t%s%n",
c, c.getDescription());
}
}
}

執行結果:
TURN_LEFT
        向左轉
TURN_RIGHT
        向右轉
SHOOT
        射擊


列舉型態即然是類別,那麼您可以為它加上 建 構方法(Constructor)嗎?答案是可以的,但是不得為公開(public),這是為了避免粗心的程式設計人員直接實例化它,一個不為公 開的建構方法可以作什麼?來看看下面這個例子:
  • OpConstants.java
public enum OpConstants {
TURN_LEFT("向左轉"), TURN_RIGHT("向右轉"), SHOOT("射擊");

private String description;

OpConstants(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}

在列舉TURN_LEFT、TURN_RIGHT、SHOOT成員時,您一併指定描述給它,這個描述會在建構列舉物件時使用,程 式中您將之設定給私用成員description,在使用getDescription()時將之返回,使用上面的ShowEnum,您可以得到相同的 顯示結果。


與類別一樣,在定義列舉值時也可以一併實作 介面 (interface),例如:

  • IEnumDescription.java
public interface IEnumDescription {
public String getDescription();
}

您可以使用這個介面規定每個實作該介面的列舉值,必須傳回一個描述列舉值的字串,例如:
  • OpConstants.java
public enum OpConstants implements IEnumDescription {
TURN_LEFT("向左轉"), TURN_RIGHT("向右轉"), SHOOT("射擊");

private String description;

OpConstants(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}