枚舉:不用那么單調,可以承擔一些業務意義
人們大多順手定義了一個枚舉,僅僅是值的羅列,比如常見的一個,定義一個顏色枚舉:
人們很少去想這么一個問題:枚舉應該也可以承擔一些業務意義。比如在這個Color枚舉中,在某些情況下,我們需要得到顏色的名稱,并且具有一個數字版本的ID,若能提供一個隨機的顏色值就更好不過了。怎么辦 ?
大部分人們會另建立一個類,提供幾個方法,對枚舉進行操作,以達到目的。但是這些方法本身應該是Color自身的一些動作,只是被割裂了。下面的代碼就能很好的完成以上要求:
枚舉是一個class變體,類似于 RED("red",1) 可以看做是定了一個初始化Color的一個實例,其構造方法簽名具有兩個參數需要傳入。
現在的調用方式:
Color.RED.getName(), Color.RED.getId()
嗯,缺少了一個隨機的顏色輸出方法,下面我們在Color里面添加如下代碼:
要想提供一個隨機的顏色值,那就是靜態的,不是一個具體顏色的本身屬性。枚舉都是具有values屬性,返回一個數組。使用方法為
有時,我們需要傳入一個顏色值字符串獲得對應的枚舉值:
構造了一個私有的Map對象,提升查詢時的速度。使用方法:
Color color = Color.getByName(“red”);
若通過ID進行查詢也可以按此方法,這里不再提供。下面為完整的代碼:
下面是UML示意圖:

這里不是教大家獲取枚舉的一些編程技巧,那不是本意。只是想讓一些看到本文的人注意一下:枚舉可以承擔一些業務意義。
public enum Color {
RED,GREEN,BLUE
}
大部分人們會另建立一個類,提供幾個方法,對枚舉進行操作,以達到目的。但是這些方法本身應該是Color自身的一些動作,只是被割裂了。下面的代碼就能很好的完成以上要求:
public enum Color {
RED("red",1),GREEN("green",2),BLUE("blue",3);
private String name;
private int id;
/**
* 必須的,使用一個構造函數用以初始化枚舉常量
* @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;
}
}
現在的調用方式:
Color.RED.getName(), Color.RED.getId()
嗯,缺少了一個隨機的顏色輸出方法,下面我們在Color里面添加如下代碼:
private static Random random = new Random(47);
/**
* 隨機提供一個顏色 使用方法 : Color color = Color.random();
*
* @return Color
*/
public static Color random() {
Color[] colors = Color.values();
return colors[random.nextInt(colors.length)];
}
要想提供一個隨機的顏色值,那就是靜態的,不是一個具體顏色的本身屬性。枚舉都是具有values屬性,返回一個數組。使用方法為
Color color = Color.random();
//一些屬性的獲取等操作
/**
* 構造一個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);
}
}
/**
* 通過顏色名稱獲取顏色枚舉實例
* @return
*/
public static Color getByName(String colorName){
return clorNameMap.get(colorName);
}
Color color = Color.getByName(“red”);
若通過ID進行查詢也可以按此方法,這里不再提供。下面為完整的代碼:
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* 枚舉可以承擔一些業務意義
*
* @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;
/**
* 必須的,使用一個構造函數用以初始化枚舉常量
*
* @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);
/**
* 隨機提供一個顏色 使用方法 : Color color = Color.random();
*
* @return Color
*/
public static Color random() {
Color[] colors = Color.values();
return colors[random.nextInt(colors.length)];
}
/**
* 構造一個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);
}
}
/**
* 通過顏色名稱獲取顏色枚舉實例
*
* @return
*/
public static Color getByName(String colorName) {
return clorNameMap.get(colorName);
}
public String toString() {
return name + "(" + id + ")";
}
}

這里不是教大家獲取枚舉的一些編程技巧,那不是本意。只是想讓一些看到本文的人注意一下:枚舉可以承擔一些業務意義。
posted on 2010-10-22 11:52 nieyong 閱讀(722) 評論(0) 編輯 收藏 所屬分類: Java