最近遇到一种需求场景:使用一个类封装Java服务端返回的(返回状态码,返回信息字符串)信息,比如(0,操作成功)、(1,新增失败)、(2,查询失败)等状态。作为一枚Java屌丝,我想到这种常量信息最好写到一个单独的类里面,并且用public static final的形式修饰,为了将返回码code和返回信息msg两者绑定起来可以提供一个公用方法。我做了以下两个努力,一是将两个返回码和返回信息的变量名写的相似,看代码的人一看就知道两个变量的含义和关系;第二个则提供一个根据返回码获得对应的返回信息的方法。写完后自我感觉良好,感觉满足了需求很是完备,于是出现了以下的2B代码:
枚举状态码和状态信息的2B写法
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; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
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方法,有传递对应不上的风险;
学习总是发生在不经意间,在看过其他人的一段代码后,才发现自己写的有多烂,有这么一种艺术的写法:
枚举状态码和状态信息的艺术写法
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; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
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代码和艺术代码的调用方法对比
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); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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
)
;
}
}
|
明显的对比显示出第二种写法的优势:简洁、好用、不易出错。
本文地址:http://www.crazyant.net/1689.html ,转载请注明,谢谢