1. 程式人生 > >【程式碼優化】使用enum代替int常量

【程式碼優化】使用enum代替int常量

經常帶程式碼中看見這樣的程式碼:

public static final int APP_START=1;

public static final int APP_PAUSE=0;

public static final int APP_STOP =2;

public static final int PLAY_START=1;

public static final int PLAY_PAUSE=0;

public static final int PLAY_STOP =2;

這種方法叫作int列舉模式,存在很多不足,但是經常被我們這樣寫。它在型別安全性和使用方便性沒有任何幫助

如果將app_傳到play_的方法中,編譯器不會出現警告,還會用== 操作將app_和play_進行對比,甚至更糟糕:

int  i =(APP_START  - PLAY_START) / PLAY_START;


採用int 列舉是編譯時常量,,如果與int常量相關的值發生變化,客戶端只有通過再次編譯,才會有效果。

怎麼避免這種缺陷呢,在java1.5開始,提供了enum列舉方案:

public enum APP { START ,STOP ,PAUSE};

public enum PLAY{ START ,STOP ,PAUSE};

表面上看沒什麼兩樣,但是並非如此,java的列舉型別,是功能十分齊全的,java的列舉本質上還是int值。

列舉提供了編譯時的型別安全,如果宣告一個引數型別為App,就可以保證,被傳到該引數上的任何非空物件一定

屬於有效的app 3個屬性之一,不會引用到play的屬性。

包名同名的常量的多個列舉可以在一個系統中和平共處。因為每個型別都有自己的名稱空間

比如app.start與play.start沒有任何衝突。

列舉型別還允許新增任意的方法和域。可以利用適當的方法增強列舉型別,也可以作為列舉常量的集合

,隨著時間的推移成為全功能的抽象

總之,與int 常量相比,列舉型別的優勢不言而喻,列舉型別易讀得多,也更加安全,更加強大。