java基礎之Enum列舉
1 enum的簡單使用
列舉是jdk1.5新增的新特性,列舉enum可以將一組具名的值得有限集合建立為一種新的型別,而這些具名的值可以作為常規的程式元件使用。上面的說明來自<java程式設計思想>,我看完了之後得到兩個有用資訊,把集合表示成一種新型別,新型別可以作為常規的類似普通類進行使用。
程式設計過程中會用到很多很多的常量,普通的定義方式就是通過定義靜態變數的方式(我現在有時依然定義成靜態變數),使用方式也十分的簡單,但是存在的問題也很明顯,雖然定義時可以取名字進行區分,但是如果作為函式引數填入相同型別的任意值都不會報錯,如果此時我們想讓一個函式只接收特定的某幾個固定的常量值,此時是沒辦法區分的。
enum ColorEnum {
RED,GREEN,BLUE
}
private static final int RED = 0;
private static final int GREEN = 1;
private static final int BLUE =2;
public void getColor(int col) {
if(col == RED) {
}
}
public void getColor(ColorEnum cenum) {
if(cenum == ColorEnum.RED) {
}
}
接收列舉型別的函式使用時只能傳入列舉型別的值。
如果列舉不新增任何方法,列舉值預設為從0開始的有序數值。定義的列舉常量RED:0,GREEN:1,BLUE:2
列舉和類相似,當卻比類的限制要多很多,不能繼承enum,但可以將enum當做一個常規的類。
定義一個列舉變數會生成一個對應的列舉類,所以列舉相當於一個類不能再函式內部定義。
列舉中可以增加變數和方法。
2 列舉的其他說明
第1部分介紹了列舉作為常量的使用,下面講解列舉的其他使用:
2.1 enum支援switch
public void getEnumData(ColorEnum cenum) {
switch(cenum) {
case RED :
break;
case BLUE:
break;
case GREEN:
break;
}
}
2.2 enum 靜態匯入
import static com.ldx.enumdemo.EnumDemo.ColorEnum.*;
import com.ldx.enumdemo.EnumDemo.ColorEnum;
public class Test {
public static void main(String[] args) {
ColorEnum color1 = BLUE;
}
}
2.3 values獲取陣列
public void valuesDemo() {
ColorEnum[] data = ColorEnum.values();
for(ColorEnum c : data) {
System.out.println(c);
}
}
2.4 列舉中可以增加欄位和方法
enum ColorEnum {
RED(1,"red"),GREEN(2,"green"),BLUE(3,"blue");
private final int key;
private final String value;
private ColorEnum(int key,String value) {
this.key = key;
this.value = value;
}
public int getKey() {
return key;
}
public String getValue() {
return value;
}
}
建構函式修飾符不能是public,可以新增函式,建構函式的引數和enum項的引數對應。
2.5 列舉進行常量比較時可以直接利用==進行比較
==一般用於比較地址,列舉的比較可以直接用 “= =”比較,效能會有所提高。
2.6 列舉類編譯後預設為final class,不允許繼承可防止被子類修改
定義enum,編譯後生成了一個單獨的enum類,final型別不能被繼承。
final class com.ldx.enumdemo.EnumDemo$ColorEnum extends java.lang.Enum<com.ldx.enumdemo.EnumDemo$ColorEnum> {
public static final com.ldx.enumdemo.EnumDemo$ColorEnum RED;
public static final com.ldx.enumdemo.EnumDemo$ColorEnum GREEN;
public static final com.ldx.enumdemo.EnumDemo$ColorEnum BLUE;
private static final com.ldx.enumdemo.EnumDemo$ColorEnum[] ENUM$VALUES;
static {};
private com.ldx.enumdemo.EnumDemo$ColorEnum(java.lang.String, int);
public static com.ldx.enumdemo.EnumDemo$ColorEnum[] values();
public static com.ldx.enumdemo.EnumDemo$ColorEnum valueOf(java.lang.String);
}
javap檢視class檔案,生成了一個final類
2.7 enum可以實現介面
interface EnumInter{
public String enumDesc();
}
enum ColorEnum implements EnumInter{
RED(1,"red"){
@Override
public String enumDesc() {
// TODO Auto-generated method stub
return null;
}
},GREEN(2,"green"){
@Override
public String enumDesc() {
// TODO Auto-generated method stub
return null;
}
},BLUE(3,"blue"){
@Override
public String enumDesc() {
// TODO Auto-generated method stub
return null;
}
};
private final int key;
private final String value;
private ColorEnum(int key,String value) {
this.key = key;
this.value = value;
}
2.8 enum變數為什麼不能再進行繼承
從2.6我們知道,enum最終會生成一個繼承了Enum的類,java不支援多繼承所以enum不能再繼承其他類。
2.9使用介面組織列舉
無法從enum繼承子類,如何擴充套件enum中的元素呢,可以利用介面方式進行擴充套件。
public interface Color{
enum ColorDemo implements Color{
RED,GREEN,BLUE
}
}
此時列舉的元素都是一種Color型別。
2.10 使用enum實現單例模式
不推薦
3 android中不推薦使用列舉
android開發和普通的java開發不太一樣,因為手機裝置上的記憶體是十分珍惜的資源,任何耗費記憶體的資料結構都應該避免,否則極易造成記憶體溢位。
enum 定義之後會生成final型別的class,class裡面含有定義的常量,所以比直接使用常量耗費更多記憶體你,所以官方不推薦。