java枚舉的使用, 常量與枚舉的區別

public enum Light {
        RED, GREEN, YELLOW;
}


咱們只可以表示出紅燈、綠燈和黃燈,可是具體的值咱們沒辦法表示出來。 java

 別急,既然枚舉類型提供了構造函數,咱們能夠經過構造函數和覆寫toString方法來實現 ide

首先給Light枚舉類型增長構造方法,而後每一個枚舉類型的值經過構造函數傳入對應的參 函數

數, 同時覆寫toString方法,在該方法中返回從構造函數中傳入的參數,代碼如下: 性能

public enum Light {
    RED("紅燈"), GREEN("綠燈"), YELLOW("黃燈");

    private String code;

    private Light(String code) {
        this.code = code;
    }


//    @Override
//    public String toString() {
//        return String.valueOf(this.code);
//    }
}

 class EnumTest{
     public static void main(String[] args) {
         System.out.println("============演示枚舉類型的遍歷:");
         testListEnum();

     }
     static void  testListEnum(){
         Light[] allLight = Light.values();
         for (Light light:allLight) {
             System.out.println("當前燈name:"+light.name());
             System.out.println("當前燈順序:"+light.ordinal());
             System.out.println("當前燈:"+light);
         }
     }
}



常量和枚舉的區別: 優化

public interface ConstInterfaceA {  
  public static final String CONST_A = "aa";  
  public static final String CONST_C = "ac";  
}



存在問題: this

1) 沒法限制開發員繼承/實現接口. spa

2) 常量做爲參數時,是String,int等弱類型,開發員傳入沒有在常量接口裏定義的值,這個問題沒法經過編譯器發現. code

3) 因爲開發員能夠直接寫常量值, 因此不能用==對比,只能用equals對比,不能優化性能 繼承

4) 編譯時,是直接把常量的值編譯到類的二進制代碼裏,常量的值在升級中變化後,須要從新編譯全部引用常量的類,由於裏面存的是舊值. 接口

public class ConstClassA {  
  public static final String CONST_A = "aa";  
  public static final String CONST_C = "ac";  
  
  private ConstClassA() {  
  }  
}



常量類能夠設置構造函數爲private,從而限制繼承,也就沒有繼續添加常量的問題了.

可是其餘問題與常量接口同樣沒法解決!


枚舉類型解決了以上全部問題,主要體如今:

1) 私有構造函數,避免被繼承和擴展.

2) 定義方法的參數時,必須用枚舉常量類類型,如上面的EnumClassA類型,這樣就轉變成了強類型,不會出現弱類型引發的問題.

3) 常量值地址惟一,能夠用==直接對比,性能會有提升.

4) 編譯時,沒有把常量值編譯到代碼裏,即便常量的值發生變化也不會影響引用常量的類.

相關文章
相關標籤/搜索