枚舉(enum)類型是Java 5新增的特性,它是一種新的類型,允許用常量來表示特定的數據片斷,而且全部都以類型安全的形式來表示。Tiger 專家、developerWorks 的多產作者 Brett McLaughlin 將解釋枚舉的定義,介紹如何在應用程序中運用枚舉,以及它爲什麼能夠讓您拋棄所有舊的 public static final 代碼。
在枚舉類型出現之前,java是通過在接口或者類中定義public static final 的變量來實現的。比如,對於經典的紅色警戒2中的英國狙擊(sharp-shooter)手三個動作的描述:
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 8:53:04
* 狙擊手活動
*/
public interface SharpShooter_1 {
public static final int LOCKED = 1; //鎖定
public static final int AIM = 2; //瞄準
public static final int SHOOT = 3; //射擊
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 9:03:50
* 測試方法
*/
public class TestDemo_1 {
public static void main(String args[]) {
TestDemo_1 test = new TestDemo_1();
test.doAction(1);
test.doAction(2);
test.doAction(3);
test.doAction(4);
}
/**
* 執行的動作
* @param action
*/
public void doAction(int action) {
switch (action) {
case SharpShooter_1.LOCKED:
System.out.println("1:鎖定目標");
break;
case SharpShooter_1.AIM:
System.out.println("2:瞄準目標");
break;
case SharpShooter_1.SHOOT:
System.out.println("3:射擊");
break;
default:
System.out.println("×:遊戲還沒有定義此動作!");
}
}
}
2:瞄準目標
3:射擊
×:遊戲還沒有定義此動作!
三、枚舉類型的等價實現
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 10:10:41
* 狙擊手活動(枚舉類型實現)
*/
public enum SharpShooter_2 {
LOCKED,
AIM,
SHOOT
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 10:12:40
* 測試普通枚舉類型
*/
public class TestDemo_2 {
public static void main(String args[]){
TestDemo_2 test=new TestDemo_2();
test.doAction(SharpShooter_2.LOCKED);
test.doAction(SharpShooter_2.AIM);
test.doAction(SharpShooter_2.SHOOT);
}
/**
* 執行的動作
* @param action
*/
public void doAction(SharpShooter_2 action) {
switch (action) {
case LOCKED:
System.out.println("1:鎖定目標");
break;
case AIM:
System.out.println("2:瞄準目標");
break;
case SHOOT:
System.out.println("3:射擊");
break;
default:
System.out.println("×:遊戲還沒有定義此動作!");
}
}
}
2:瞄準目標
3:射擊
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 11:29:23
* 帶方法的枚舉類型
*/
public enum SharpShooter_3 {
LOCKED,
AIM,
SHOOT;
public String getDesc() {
switch (this.ordinal()) {
case 0:
return "鎖定目標";
case 1:
return "瞄準目標";
case 2:
return "射擊";
default:
return "沒有該枚舉值!";
}
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 11:32:40
* 測試枚舉方法
*/
public class TestDemo_3 {
public static void main(String args[]) {
for (SharpShooter_3 enumSS : SharpShooter_3.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
AIM 瞄準目標
SHOOT 射擊
Process finished with exit code 0
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 11:37:20
* 帶私有構造方法的枚舉類型
*/
public enum SharpShooter_4 {
LOCKED("鎖定目標"),
AIM("瞄準目標"),
SHOOT("射擊");
private String desc; //枚舉說明
/**
* 私有的構造方法
*/
private SharpShooter_4(String desc){
this.desc=desc;
}
/**
* 獲取枚舉值的說明
* @return String
*/
public String getDesc(){
return desc;
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 11:42:50
* 測試帶私有構造方法的枚舉類型
*/
public class TestDemo_4 {
public static void main(String args[]) {
for (SharpShooter_4 enumSS : SharpShooter_4.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
AIM 瞄準目標
SHOOT 射擊
Process finished with exit code 0
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 13:59:47
* 說明接口
*/
public interface IDesc {
/**
* 獲取說明信息
* @return String
*/
public String getDesc();
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 13:43:22
* 實現了接口的枚舉類型
*/
public enum SharpShooter_5 implements IDesc {
LOCKED("鎖定目標"),
AIM("瞄準目標"),
SHOOT("射擊");
private String desc; //枚舉說明
/**
* 私有的構造方法
*/
private SharpShooter_5(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 14:03:26
* 測試實現了接口的枚舉類型
*/
public class TestDemo_5 {
public static void main(String args[]) {
for (SharpShooter_5 enumSS : SharpShooter_5.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
AIM 瞄準目標
SHOOT 射擊
Process finished with exit code 0
4、每個枚舉值實現的自己的接口
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 14:05:48
* 每個枚舉值自己實現接口
*/
public enum SharpShooter_6 implements IDesc {
LOCKED(){
public String getDesc() {
return "鎖定目標";
}
},
AIM{
public String getDesc() {
return "瞄準目標";
}
},
SHOOT{
public String getDesc() {
return "射擊";
}
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 14:10:28
* 測試每個枚舉值自己實現接口
*/
public class TestDemo_6 {
public static void main(String args[]) {
for (SharpShooter_6 enumSS : SharpShooter_6.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
AIM 瞄準目標
SHOOT 射擊
Process finished with exit code 0
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 14:13:25
* 帶有抽象方法的枚舉類型
*/
public enum SharpShooter_7 {
LOCKED(){
public String getDesc() {
return "鎖定目標";
}
},
AIM{
public String getDesc() {
return "瞄準目標";
}
},
SHOOT{
public String getDesc() {
return "射擊";
}
};
/**
* 抽象方法,每個枚舉值都必須自己實現
*
* @return String
*/
public abstract String getDesc();
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-11-29
* Time: 14:16:56
* 測試帶有抽象方法的枚舉類型
*/
public class TestDemo_7 {
public static void main(String args[]) {
for (SharpShooter_7 enumSS : SharpShooter_7.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
AIM 瞄準目標
SHOOT 射擊
Process finished with exit code 0