From Gossip@caterpillar

Java Gossip: 因值而異的類實作(Value-Specific Class Bodies)

因值而異的類實作?原文為 Value-Specific Class Bodies,其實這個功能簡單的說,實作時像是在使用匿名 內 部類別(inner class) 來實現 Command 模式,它讓您可以為每個列舉值定義各自的類本體與方法(Method)實作。

先來看看其中一種實現的方式,我們先宣告介面:

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

這個getDescription()方法,我們希望每個列舉的實例實作自己的方法(而不是像 列 舉上的方法 所介紹的,在定義列舉時統一實作一個getDescription()方法)例如:

  • OpConstants.java
public enum OpConstants implements IEnumDescription {
TURN_LEFT {
public String getDescription() {
return "向左轉";
}
}, // 記得這邊的列舉值分隔 ,

TURN_RIGHT {
public String getDescription() {
return "向右轉";
}
}, // 記得這邊的列舉值分隔 ,

SHOOT {
public String getDescription() {
return "射擊";
}
}; // 記得這邊的列舉值結束 ;
}

{ 與 } 之間是類本體,您可以在當中如何定義類別一樣宣告field成員或實作方法。TURN_LEFT、TURN_RIGHT與SHOOT三個 OpConstants的列舉實例,它們各自在本體(Body) { 與 } 之間實作了自己的getDescription()方法,而不是像上個主題中統一實作在OpConstants中,再將上個主題中的程式列出,比較一下兩 者的不同:
  • 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;
}
}

寫個測試程式看看結果:
  • 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
        射擊


這個例子是將因值而異的類實作用在返回列舉值描述上,您可以依相同的方式,為每個列舉值加上一些各自的方法實作,而呼叫的介面是統一的。

您也可以運用抽象方法來改寫上面的OpConstants,例如:

  • OpConstants.java
public enum OpConstants {
TURN_LEFT {
public String getDescription() {
return "向左轉";
}
},

TURN_RIGHT {
public String getDescription() {
return "向右轉";
}
},

SHOOT {
public String getDescription() {
return "射擊";
}
};

// 宣告個抽象方法
public abstract String getDescription();
}

執行結果是一樣的;基本上定義介面方法或抽象方法,是為了知道物件的操作方法,這樣您才能去操作這個物件。