接口常量組:簡單但無類型安全
public interface Months {
int JANUARY = 1, FEBRUARY = 2, ..., DECEMBER = 12;
}
// 使用:Months.JANUARY
- 優點:語法簡單,命名空間隔離,避免魔術數字。
- 缺點:本質是
int,編譯器不阻止傳入無效值(如 99)。
類型安全枚舉模式:Month2 實現
public final class Month2 {
private String name;
private Month2(String nm) { name = nm; } // 私有構造器,防實例化
public String toString() { return name; }
public final static Month2 JAN = new Month2("January"), ... DEC = new Month2("December");
public final static Month2[] month = { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
// 注:數組多放一個 JAN 使下標 1-12 對應月份
}
優勢
- 類型安全:變量聲明
Month2 m 只能接受 Month2 實例。
- 單例模式:每月份僅一實例,可用
== 比較(同 equals())。
- 可擴展行為:可添加方法(如
daysInMonth())。
- 命名空間隔離:
Month2.JAN。
對比總結
| 特性 | 接口常量 | 類型安全枚舉 |
| 類型安全 | 無(int) | 強 |
| 比較方式 | == | == / equals() 均可 |
| 可擴展方法 | 否 | 是 |
| Java 5+ 建議 | 直接用 enum 關鍵字(本質同類型安全枚舉) |