您的位置:首页 > 编程语言 > Java开发

Java枚举使用一例

2007-12-01 20:01 281 查看
在一个Server/Client程序中,对Client端的每个请求,Server端返回的结果中均包含响应状态码和响应内容两部分。对于状态码的处理,以前的做法通常是用一系列public static final int常量来定义。调用者往往要写一些额外的代码对传入的状态码进行有效性检查。在Java 5以后,可以用枚举类型来处理,好处就不用细说了:接口直观,类型安全等。

一、使用枚举实现类型安全的接口

下面是使用枚举来实现的示意代码:
//OpStatus.java 定义状态码枚举类型
public enum OpStatus{
S_OK, //正常结果
S_PROTOCOL, //协议格式错误
S_AUTH, //用户名/密码错误
S_ITEMEXISTED, //业务异常1,条目已存在
S_SQL, //数据库操作异常
S_UNKNOWN; //未知异常
}


//OpTest.java 状态码调用示例
public class OpTest{
//这个方法中采用强类型的OpStatus,不要额外的检查代码
public void writeResponse(OpStatus status, String content){
System.out.println("[Status]"+status+"[Content]"+content);
}


public static void main(String[] args){
OpTest test=new OpTest();
test.writeResponse(OpStatus.S_OK,"good result");
test.writeResponse(OpStatus.S_ITEMEXISTED,"item existed exception");
}
}


运行上面的测试程序,发现输出的结果是:
[Status]S_OK......
[Status]S_ITEMEXISTED......
这并不是客户端想要的结果,客户端需要的是0,1,2之类的状态码数值。

二、枚举类型的toString()和ordinal()方法

查阅Java Document,原来枚举类型toString()的结果是枚举常量的名称,而不是序号。Java提供了另外一个方法来获取枚举常量的序号:
public final int ordinal();

因此我们需要覆盖toString()方法,让其返回序号值,下面是修改后的代码:
public enum OpStatus{
S_OK,
S_PROTOCOL,
S_AUTH,
S_ITEMEXISTED,
S_SQL,
S_UNKNOWN;


@Override
public String toString(){
return String.valueOf(ordinal());
}
}


再次运行上面的测试程序,发现输出了期望的结果:
[Status]0......
[Status]3......


三、定制枚举常量的序号

但是问题又来了,随着开发的进行,又增加了一个业务状态码S_ITEMNOTFOUND,它要插入到S_ITEMEXISTED之后,而且以后可能还会增加其他状态码。上面的从0~5的顺序序号已经不能满足需要,我们需要自由定义每个枚举常量的序号,比如,使S_SQL序号为15,S_UNKNOWN序号为16,以后增加的业务状态码序号在3~15之间。

在C语言中,定义枚举的同时可以为其指定序号。但是这在Java中是行不通的,修改OpStatus:
S_OK=0,
.......
S_SQL=15,
S_UNKNOWN=16;
不难发现,这样的修改将导致编译错误。

继续查阅文档发现,枚举和Java类很相似,可以定义变量和方法,包括构造方法。和类有点区别的是构造方法不能为public,以防止客户实例化。

下面是根据这种思路修改后的OpStatus,已经看起来和一个普通Java类差不多了。
public enum OpStatus{
//枚举常量定义的同时指定状态码
S_OK(0),
S_PROTOCOL(1),
S_AUTH(2),
S_ITEMEXISTED(3),
S_ITEMNOTFOUND(4),
S_SQL(15),
S_UNKNOWN(16);


private int code; //状态码值

OpStatus(int code){ //非public构造方法
this.code=code;
}


@Override
public String toString(){
return String.valueOf(code);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: