一个真实项目的分析

1.一个超象类里面定义了5个方法,其中三个是共同的业务逻辑,只有很少一部分是根据不同的情况来定义的。

这时候把相同的业务逻辑提炼到超类当中去,有差异的业务逻辑放到具体的子类当中去。

2.关于注解的理解:

@Resource的作用和用法

@Resource  的作用相当于 @Autowired,只不过 @Autowired  byType 自动注入,面 @Resource  默认按 byName自动注入罢了。

@Resource  有两个属性是比较重要的,分别是 name typeSpring @Resource  注释的 name属性解析为 Bean的名字,

type属性则解析为 Bean的类型。所以如果使用 name属性,则使用 byName的自动注入策略,而使用 type属性时则使用 byType

自动注入策略。如果既不指定 name也不指定 type属性,这时将通过反射机制使用 byName自动注入策略。

还有一点,按照名字注入可以使用父类对象指向子类应用。

    @Resource(name="threadLocalOperatorIdentityValidator")
    protected IdentityValidator identityValidator;

3. 枚举是从java1.5之后才有的,所以枚举产生之前都是用静态变量实现存放静态数据


4.关于语无逻辑的存在问题

项目里面定义了一个枚举类

package com.vlives.phoneclient.core;

import org.apache.commons.lang.StringUtils;

public enum ClientRequestCode {
    NEWS_HISTORY("M101","消息历史",true),
    LOGIN("M102","登录",true),
    LOGOUT("M103","退出登录",true),
    MODIFY_PASSWORD("M104","修改密码",true),
    MARK_GPS("M106","保存定位信息",true),
    VERSION_INFO("M107","获取版本信息",false),
    CONTACT_US("M108","联系我们",false),
    QUERY_MERCHANT_BANKS("M111","查询商户银行卡",true),
    QUERY_ACCOUNT_MONEY("M112","查询帐户余额和待结算金额",true),
    QUERY_ACCOUNT_INFO("M113","查询帐户信息",true),
    ANNOUNCEMENT_LIST("M114","公告列表",false),
    MEWS_DETAIL("M115","消息详情",true),
    SETTLEMENT_INFO("M116","结算信息",true),
    SETTLEMENT_DETAIL("M117","结算单详情",true),
    INCOME_EXPENSES_INFO("M118","其他收入项/支出项查询",true),
    TRADE_INFO("M119","交易信息查询",true),
    TRADE_LIST("M120","交易列表",true),
    SETTLEMENT_LIST("M121","结算单列表",true),
    TRADE_DETAIL("M122","交易详情",true),
    TRADE_SUM("M123","交易汇总",true),
    BRANCH_DETAIL("M124","分店详情",true),
    TRANS_RECORD("M125","电子凭单",true),
    SHOW_SIGNATURE("M126","电子凭单页面",true),
    INSERT_DEVICETOKEN("M127","插入IOS_TOKEN",true),
    DELETE_DEVICETOKEN("M128","删除IOS_TOKEN",true),
    ;
    
    private final String code;
    private final String desc;
    private final boolean needLogin;
    
    private ClientRequestCode(String code,String desc,boolean needLogin){
        this.code=code;
        this.desc=desc;
        this.needLogin=needLogin;
    }

    public String getCode() {
        return code;
    }
    public String getDesc() {
        return desc;
    }
    public boolean isNeedLogin() {
        return needLogin;
    }
    public static ClientRequestCode get(String code){
        for(ClientRequestCode rc:ClientRequestCode.values()){
            if(StringUtils.equals(code, rc.getCode())){
                return rc;
            }
        }
        return null;
    }
}

这样的话精简了大量的重复代码。

返回代码:

package com.vlives.phoneclient.core;

public enum ClientResponseCode {
    
    SUCCESS("0000","成功"),
    SYSTEM_ERROR("0001","系统错误"),
    DB_ERROR("0002","数据库异常"),
    ARGUMENTS_LACK("0003","参数不完整"),
    ARGUMENTS_DATA_TYPE_MISTAKE("0004","参数类型不正确"),
    USER_NOT_EXISTS("1001","用户名不存在"),
    PASSWORD_ERROR("1002","密码错误"),
    PASSWORD_ERROR_REJECT_WITHIN_2HOUR("1003","密码错误3次,请2小时后重试"),
    RELOGIN("1004","请重新登录"),
    ORIGINAL_PASSWORD_ERROR("2001","原密码不正确"),
    ORIGINAL_PASSWORD_REJECT_WITHIN_2HOUR("2002","原密码错误3次,请2小时后重试"),
    TWO_PASSWORDS_NOT_MATCH("2003","两次密码不一致"),
    NEWS_HISTORY_QUERY_FAILURE("3001","消息历史查询失败"),
    NEWS_DETAIL_QUERY_FAILURE("3002","消息详情查询失败"),
    BANK_CARD_QUERY_FAILURE("4001","银行卡查询失败"),
    VERSION_QUERY_FAILURE("5001","版本获取失败"),
    BALANCE_QUERY_FAILURE("6001","余额查询失败"),
    SETTLEMENT_QUERY_FAILURE("7001","结算单查询失败"),
    INCOME_EXPENSES_QUERY_FAILURE("7002","查询其它收支项列表失败"),
    TRADE_QUERY_FAILURE("7003","交易单查询失败"),
    MERCHANT_FAILURE("7004","商户信息不存在"),
    ;
    
    private final String code;
    private final String desc;
    
    private ClientResponseCode(String code,String desc){
        this.code=code;
        this.desc=desc;
    }

    public String getCode() {
        return code;
    }
    public String getDesc() {
        return desc;
    }
}

这个做了大量的抽象。

你可能感兴趣的:(一个真实项目的分析)