聂永的博客

记录工作/学习的点点滴滴。

枚举:不用那么单调,可以承担一些业务意义

人们大多顺手定义了一个枚举,仅仅是值的罗列,比如常见的一个,定义一个颜色枚举:
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示意图:
enum

这里不是教大家获取枚举的一些编程技巧,那不是本意。只是想让一些看到本文的人注意一下:枚举可以承担一些业务意义。

posted on 2010-10-22 11:52 nieyong 阅读(682) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航:
 

公告

所有文章皆为原创,若转载请标明出处,谢谢~

新浪微博,欢迎关注:

导航

<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(58)

随笔分类(130)

随笔档案(151)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜