IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Java枚举类型代码的二逼写法和艺术写法

    Crazyant发表于 2014-11-16 15:11:45
    love 0

    最近遇到一种需求场景:使用一个类封装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;
    	}
    }
    

    这种写法存在的问题有两个:

    • 如果需要新增状态码和状态信息,需要在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;
    	}
    }
    

    每次新增一个状态,只需要增加一个枚举的元素即可,不会出现状态码和信息对应不上的调用问题。

    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);
    	}
    }
    

    明显的对比显示出第二种写法的优势:简洁、好用、不易出错。

    本文地址:http://www.crazyant.net/1689.html ,转载请注明,谢谢

    您可能也喜欢:

    java环境变量配置

    Java怎样创建两个KEY(key-pair)的MAP

    读书破万卷,代码如有神

    《Spring in action》3rd中SpringPizza项目的运行方法

    Rational Rose根据Java代码自动生成类图(教程和错误解决)
    无觅


沪ICP备19023445号-2号
友情链接