From Gossip@caterpillar

Java Gossip: 常數設置

有時候您會需要定義一些常數供程式使用,您可以使用介面或類別來定義,例如定義操作常數:
  • OpConstants.java
public interface OpConstants { 
public static final int TURN_LEFT = 1;
public static final int TURN_RIGHT = 2;
public static final int SHOOT = 3;
}

常數必須是可以直接取用,並且不可被修改的,所以我們在宣告時加上 staticfinal,事實上,對於介面來說,當中的常數預設就為public、static、final,即使您沒有明確指定修飾,例如下例與上例是一樣的:

  • OpConstants.java
public interface OpConstants { 
int TURN_LEFT = 1;
int TURN_RIGHT = 2;
int SHOOT = 3;
}

這意謂著如果您實作的介面中有定義常數,您不可以重新指定該常數值,例如下例是錯誤的…
interface ISome {
    int const = 10;
    ...
}

public class Some implements ISome {
    public Some() {
        const = 20;  // 這行是錯的
    }
}

宣告常數之後,就可以在程式中直接使用 OperateConstants.TURN_LEFT之類的名稱來取代常數值,例如:
public void someMethod() {
     ....
    doOp(OpConstants.TURN_RIGHT);
    ....
}
 
public void doOp(int op) {
    switch(op) {
        case OpConstants.TURN_LEFT:
            System.out.println("向左轉");
            break;
        case OpConstants.TURN_RIGHT:
            System.out.println("向右轉");
            break;
        case OpConstants.SHOOT:
            System.out.println("射擊");
            break;
    }
}

如果使用類別來宣告的話,方法也是類似,例如:
  • OpConstants.java
public class OpConstants { 
public static final int TURN_LEFT = 1;
public static final int TURN_RIGHT = 2;
public static final SHOOT = 3;
}

對於簡單的常數設置,上面的作法已經足夠了,不過在 J2SE 5.0 中新增了 列舉型態(Enumerated Types),使用列舉型態,除常數設定的功能之外,您還可以獲得像編譯時期型態檢查等的更多好處。