沒有enum之前


在interface中,可以定義常數。例如:
  • Action.java
package cc.openhome;

public interface Action {
public static final int STOP = 0;
public static final int RIGHT = 1;
public static final int LEFT = 2;
public static final int UP = 3;
public static final int DOWN = 4;
}

Java中很常見到於介面中定義這類常數,稱為列舉常數,這讓程式撰寫清晰一些。例如:
  • Game.java
package cc.openhome;

public class Game {
public static void play(int action) {
switch(action) {
case Action.STOP:
System.out.println("播放停止動畫");
break;
case Action.RIGHT:
System.out.println("播放向右動畫");
break;
case Action.LEFT:
System.out.println("播放向左動畫");
break;
case Action.UP:
System.out.println("播放向上動畫");
break;
case Action.DOWN:
System.out.println("播放向下動畫");
break;
default:
System.out.println("不支援此動作");
}
}
public static void main(String[] args) {
play(Action.RIGHT);
play(Action.UP);
}
}

想想看,如果將上面這個程式改為以下,哪個在維護程式時比較清楚呢?
...
    public static void play(int action) {
        switch(action) {
            case 0:   // 數字比較清楚?還是列舉常數比較清楚?
                System.out.println("播放停止動畫");
                break;
            case 1:
                System.out.println("播放向右動畫");
                break;
            case 2:
                System.out.println("播放向左動畫");
                break;
                略...
            default:
                System.out.println("不支援此動作");
        }
    }
    public static void main(String[] args) {
        play(1);     // 數字比較清楚?還是列舉常數比較清楚?
        play(3);
    }   
...

事實上,在interface中,也只能定義public static final的列舉常數,為了方便,也可以如下撰寫:
public interface Action {
    int STOP = 0;
    int RIGHT = 1;
    int LEFT = 2;
    int UP = 3;
    int DOWN = 4;
}

編譯器會幫你展開為public static final,所以在介面中列舉常數,一定要使用=指定值,否則就會編譯錯誤。