1. 程式人生 > >介面(類)常量與列舉常量的區別

介面(類)常量與列舉常量的區別

一、分析 常量的宣告是每一個專案中不可或缺的,在Java1.5之前,我們只有兩種方式的宣告:類常量和介面常量。不過,在1.5版之後有了改進,即新增了一種常量宣告方式,列舉常量。程式碼如下: enum Season{     Spring,Summer,Autumn,Winter; }
 二、場景 那麼列舉常量與我們的經常使用的類常量和靜態常量比有什麼優勢呢?
  1.列舉常量更簡單 先把Season列舉翻譯成介面,程式碼如下: interface Season{     int Sprint = 0;     int Summer = 1;     int Autumn = 2;     int Winter = 3; }
  列舉只需要定義每個列舉項,不需要定義列舉值,而介面常量(或類常量)則必須定義值,否則編譯通不過;兩個引用的方式相同(都是“類名.屬性”,如Season.Sprint),但是列舉表示的是一個列舉項,字面含義是春天,而介面常量卻是一個Int型別。
  2.列舉常量屬於穩態型 使用常量介面,我們得對輸入值進行檢查,確定是否越界,如果常量非常龐大,校驗輸入就是一件非常麻煩的事情,但這是一個不可逃避的過程。
   public void describe(int s){     //s變數不能超越邊界,校驗條件    
    if(s >= 0 && s <4){        
     switch(s){            
      case Season.Summer:                
       System.out.println("Summer is very hot!");                
       break;            
      case Season.Winter:                
       System.out.println("Winter is very cold!");                
       break;         …..       
       }    
    }
   } 我們再來看看列舉常量是否能夠避免校驗問題,程式碼如下:
   public void describe(Season s){    
    switch(s){        
     case Season.Summer:            
      System.out.println("Summer is very hot!");            
      break;        
     case Season.Winter:            
      System.out.println("Winter is very cold!");            
      break;         …...    
     }
   } 不用校驗,已經限定了是Season列舉,所以只能是Season類的四個例項。這也是我們看重列舉的地方:在編譯期間限定型別,不允許發生越界的情況。
  3.列舉具有內建方法 每個列舉都是java.lang.Enum的子類,該基類提供了諸如獲得排序值的ordinal方法、compareTo比較方法等,大大簡化了常量的訪問。比如,列出所有列舉值:
  public static void main(String[] args){
   for(Season s:Season.values()){        
    System.out.println(s);    
   }
  }
  4.列舉可以自定義方法 這一點似乎不是列舉的優點,類常量也可以有自己的方法,但關鍵是列舉常量不僅僅可以定義靜態方法,還可以定義非靜態方法,而且還能夠從根本上杜絕常量類被例項化。比如我們在定義獲取最舒服的季節,使用列舉的程式碼如下:
   enum Season{    
    Spring,Summer,Autumn,Winter;     //最舒服的季節    
    public static Season getComfortableSeason(){
     return Spring;    
    }
   } 那如果是使用類常量如何實現呢?如下:
   class Season{    
    public final static int Spring = 0;    
    public final static int Summer = 1;    
    public final static int Autumn = 2;    
    public final static int Winter = 3;     
    //最舒服的季節    
    public static int getComfortableSeason(){
     return Spring;    
    }
   } 雖然列舉在很多方面都比介面常量和類常量好用,但是它有一點比不上介面常量和類常量的,就是繼承,列舉型別是不能有繼承的,也就是說一個列舉常量定義完畢後,除非修改重構,否則無法做擴充套件。
 三、建議 在專案開發中,推薦使用列舉常量代替介面常量或類常量。