人们大多顺手定义了一个枚举,仅仅是值的罗列,比如常见的一个,定义一个颜色枚举:
public enum Color {
RED,GREEN,BLUE
}
人们很少去想这么一个问题:枚举应该也可以承担一些业务意义。比如在这个Color枚举中,在某些情况下,我们需要得到颜色的名称,并且具有一个数字版本的ID,若能提供一个随机的颜色值就更好不过了。怎么办 ?
大部分人们会另建立一个类,提供几个方法,对枚举进行操作,以达到目的。但是这些方法本身应该是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;
}
}
枚举是一个class变体,类似于 RED("red",1) 可以看做是定了一个初始化Color的一个实例,其构造方法签名具有两个参数需要传入。
现在的调用方式:
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);
}
构造了一个私有的Map对象,提升查询时的速度。使用方法:
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 + ")";
}
}
下面是UML示意图:
这里不是教大家获取枚举的一些编程技巧,那不是本意。只是想让一些看到本文的人注意一下:枚举可以承担一些业务意义。