1.一个超象类里面定义了5个方法,其中三个是共同的业务逻辑,只有很少一部分是根据不同的情况来定义的。
这时候把相同的业务逻辑提炼到超类当中去,有差异的业务逻辑放到具体的子类当中去。
2.关于注解的理解:
@Resource的作用和用法
@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName自动注入罢了。
@Resource 有两个属性是比较重要的,分别是 name和 type,Spring将 @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; } }
这个做了大量的抽象。