java枚举

在一个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);
    }
}

转自:http://blog.csdn.net/ericxyy/article/details/1911012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值