1. 程式人生 > >java基礎之Enum列舉

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裡面含有定義的常量,所以比直接使用常量耗費更多記憶體你,所以官方不推薦。