Java枚举类型代码的二逼写法和艺术写法
原创
©著作权归作者所有:来自51CTO博客作者peishuai1987的原创作品,请联系作者获取转载授权,否则将追究法律责任
最近遇到一种需求场景:使用一个类封装Java服务端返回的(返回状态码,返回信息字符串)信息,比如(0,操作成功)、(1,新增失败)、(2,查询失败)等状态。作为一枚Java屌丝,我想到这种常量信息最好写到一个单独的类里面,并且用public static final的形式修饰,为了将返回码code和返回信息msg两者绑定起来可以提供一个公用方法。我做了以下两个努力,一是将两个返回码和返回信息的变量名写的相似,看代码的人一看就知道两个变量的含义和关系;第二个则提供一个根据返回码获得对应的返回信息的方法。写完后自我感觉良好,感觉满足了需求很是完备,于是出现了以下的2B代码:
枚举状态码和状态信息的2B写法
CommunicateCodeOne.java
Java
package net . crazyant ;
/**
*
* 返回给客户端的状态码和状态信息
*
* @author crazyant.net
*
*/
public class CommunicateCodeOne {
/**
* 状态码:操作成功
*/
public static final int OPERATION_SUCCESS_CODE = 0 ;
/**
* 状态信息:操作成功
*/
public static final String OPERATION_SUCCESS_MSG = "操作成功" ;
/**
* 状态码:新增失败
*/
public static final int ADD_DATA_ERROR_CODE = 1 ;
/**
* 状态信息:新增失败
*/
public static final String ADD_DATA_ERROR_MSG = "新增失败" ;
/**
* 状态码:查询失败
*/
public static final int QUERY_DATA_ERROR_CODE = 2 ;
/**
* 状态信息:查询失败
*/
public static final String QUERY_DATA_ERROR_MSG = "查询失败" ;
/**
* 根据状态码获取状态信息
*
* @param communicateCode
* 状态码
* @return 状态信息字符串
*/
public static String getMsg ( int communicateCode ) {
String returnMsg = null ;
switch ( communicateCode ) {
case OPERATION_SUCCESS_CODE :
// 操作成功
returnMsg = OPERATION_SUCCESS_MSG ;
break ;
case ADD_DATA_ERROR_CODE :
// 新增失败
returnMsg = ADD_DATA_ERROR_MSG ;
break ;
case QUERY_DATA_ERROR_CODE :
// 查询失败
returnMsg = QUERY_DATA_ERROR_MSG ;
break ;
}
return returnMsg ;
这种写法存在的问题有两个:
- 如果需要新增状态码和状态信息,需要在getMsg方法中新增switch的case分支;
- 用户调用的时候,需要将状态码传递给getMsg方法,有传递对应不上的风险;
学习总是发生在不经意间,在看过其他人的一段代码后,才发现自己写的有多烂,有这么一种艺术的写法:
枚举状态码和状态信息的艺术写法
CommunicateCodeTwo.java
Java
package net . crazyant ;
/**
*
* 返回给客户端的状态码和状态信息
*
* @author crazyant.net
*
*/
public enum CommunicateCodeTwo {
OPERATION_SUCCESS ( 0 , "操作成功" ) ,
ADD_DATA_ERROR ( 1 , "新增失败" ) ,
QUERY_DATA_ERROR ( 2 , "查询失败" ) ;
/**
* 返回状态码
*/
private int statusCode ;
/**
* 返回状态信息
*/
private String statusMsg ;
CommunicateCodeTwo ( int statusCode , String statusMsg ) {
this . statusCode = statusCode ;
this . statusMsg = statusMsg ;
}
/**
* @return the statusCode
*/
public int getStatusCode ( ) {
return statusCode ;
}
/**
* @return the statusMsg
*/
public String getStatusMsg ( ) {
return statusMsg ;
}
}
每次新增一个状态,只需要增加一个枚举的元素即可,不会出现状态码和信息对应不上的调用问题。
2B代码和艺术代码的调用方法对比
TestThem.java
Java
package net . crazyant ;
/**
* 测试状态码类的两个不同写法类
*
* @author crazyant.net
*
*/
public class TestThem {
public static void main ( String [ ] args ) {
// 写法1的调用方法
// 缺点:状态码和状态信息的关系需要用户自己绑定,可能出现不一致的情况
int statusCode1 = CommunicateCodeOne . OPERATION_SUCCESS_CODE ;
String statusMsg1 = CommunicateCodeOne . getMsg ( statusCode1 ) ;
System . out . println ( statusCode1 + ":" + statusMsg1 ) ;
// 写法2的调用方法
// 优点:简洁,状态码和信息只能通过单个枚举元素获取
int statusCode2 = CommunicateCodeTwo . OPERATION_SUCCESS . getStatusCode ( ) ;
String statusMsg2 = CommunicateCodeTwo . OPERATION_SUCCESS . getStatusMsg ( ) ;
System . out . println ( statusCode2 + ":" + statusMsg2 ) ;
}
明显的对比显示出第二种写法的优势:简洁、好用、不易出错。