人們大多順手定義了一個(gè)枚舉,僅僅是值的羅列,比如常見的一個(gè),定義一個(gè)顏色枚舉:
public enum Color {
RED,GREEN,BLUE
}
人們很少去想這么一個(gè)問題:枚舉應(yīng)該也可以承擔(dān)一些業(yè)務(wù)意義。比如在這個(gè)Color枚舉中,在某些情況下,我們需要得到顏色的名稱,并且具有一個(gè)數(shù)字版本的ID,若能提供一個(gè)隨機(jī)的顏色值就更好不過了。怎么辦 ?
大部分人們會另建立一個(gè)類,提供幾個(gè)方法,對枚舉進(jìn)行操作,以達(dá)到目的。但是這些方法本身應(yīng)該是Color自身的一些動(dòng)作,只是被割裂了。下面的代碼就能很好的完成以上要求:
public enum Color {
RED("red",1),GREEN("green",2),BLUE("blue",3);
private String name;
private int id;
/**
* 必須的,使用一個(gè)構(gòu)造函數(shù)用以初始化枚舉常量
* @param name
* @param id
*/
private Color(String name, int id){
this.name = name;
this.id = id;
}
public String getName(){
return this.name;
}
public int getId(){
return this.id;
}
}
枚舉是一個(gè)class變體,類似于 RED("red",1) 可以看做是定了一個(gè)初始化Color的一個(gè)實(shí)例,其構(gòu)造方法簽名具有兩個(gè)參數(shù)需要傳入。
現(xiàn)在的調(diào)用方式:
Color.RED.getName(), Color.RED.getId()
嗯,缺少了一個(gè)隨機(jī)的顏色輸出方法,下面我們在Color里面添加如下代碼:
private static Random random = new Random(47);
/**
* 隨機(jī)提供一個(gè)顏色 使用方法 : Color color = Color.random();
*
* @return Color
*/
public static Color random() {
Color[] colors = Color.values();
return colors[random.nextInt(colors.length)];
}
要想提供一個(gè)隨機(jī)的顏色值,那就是靜態(tài)的,不是一個(gè)具體顏色的本身屬性。枚舉都是具有values屬性,返回一個(gè)數(shù)組。使用方法為
Color color = Color.random();
//一些屬性的獲取等操作
有時(shí),我們需要傳入一個(gè)顏色值字符串獲得對應(yīng)的枚舉值:
/**
* 構(gòu)造一個(gè)Map,并初始化,便于插敘
*/
private static Map<String, Color> clorNameMap = new HashMap<String, Color>(
Color.values().length);
static {
for (Color color : Color.values()) {
clorNameMap.put(color.getName(), color);
}
}
/**
* 通過顏色名稱獲取顏色枚舉實(shí)例
* @return
*/
public static Color getByName(String colorName){
return clorNameMap.get(colorName);
}
構(gòu)造了一個(gè)私有的Map對象,提升查詢時(shí)的速度。使用方法:
Color color = Color.getByName(“red”);
若通過ID進(jìn)行查詢也可以按此方法,這里不再提供。下面為完整的代碼:
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* 枚舉可以承擔(dān)一些業(yè)務(wù)意義
*
* @author yongboy@gmail.com
* @date 2010-10-21
*/
public enum Color {
RED("red", 1), GREEN("green", 2), BLUE("blue", 3);
private String name;
private int id;
/**
* 必須的,使用一個(gè)構(gòu)造函數(shù)用以初始化枚舉常量
*
* @param name
* @param id
*/
private Color(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
private static Random random = new Random(47);
/**
* 隨機(jī)提供一個(gè)顏色 使用方法 : Color color = Color.random();
*
* @return Color
*/
public static Color random() {
Color[] colors = Color.values();
return colors[random.nextInt(colors.length)];
}
/**
* 構(gòu)造一個(gè)Map,并初始化,便于插敘
*/
private static Map<String, Color> clorNameMap = new HashMap<String, Color>(
Color.values().length);
static {
for (Color color : Color.values()) {
clorNameMap.put(color.getName(), color);
}
}
/**
* 通過顏色名稱獲取顏色枚舉實(shí)例
*
* @return
*/
public static Color getByName(String colorName) {
return clorNameMap.get(colorName);
}
public String toString() {
return name + "(" + id + ")";
}
}
下面是UML示意圖:

這里不是教大家獲取枚舉的一些編程技巧,那不是本意。只是想讓一些看到本文的人注意一下:枚舉可以承擔(dān)一些業(yè)務(wù)意義。