6. 日志规范
6.1. 日志记录规范
? 规则
1) 禁止使用System.out.println()来记录日志;而是使用Logger或Log4J来记录。
示例: 错误的输出:
System.out.println(\+ listCaBillProds.size()); 正确的输出: if (log.isDebugEnabled()) { log.debug(\+ listCaBillProds.size()); } 2) 为不同日志消息选择不同级别, INFO(提示类)、DEBUG(调试类)、ERROR(错误类)。
3) 在输出日志时先进行级别判断,
示例:
if (logger.isDebuggable()){ logger.debug(...); }
21
7. 异常规范
7.1. 捕获的异常:不能忽视
? 规则
1) 捕获的异常需要处理,如果不需要在catch块中做任何响应,需要做注释加以说明。 示例: try{ inti=Integer.parseInt(response); returnhandleNumericResponse(i); }catch(NumberFormatExceptionok){ // it's not numeric; that's fine, just continue } returnhandleTextResponse(response); ? 建议
1) 在Java程序中,当出错的时候推荐使用异常处理机制,而不是使用Return Code。 2) 推荐使用自定义Exception,用来补充Java的Exception类。每个工程,都应该整理出通用的Exception在最外层予以统一处理。自定义的Exception视具体的应用情况继承不同的Exception,如:EOFException,IOException等。不推荐直接继承Exception类。
3) 由于Exception机制占用系统资源较高,并且会危害编译器的分析性能,所以不
要依赖异常进行业务逻辑控制,禁止滥用Exception。
22
8. 框架规范
8.1. APPFRAME框架
详见附件《NGCRM技术开发规范》
23
9. 开发约定
9.1. 性能优化
? 建议
1) 线程安全的情况下,使用StringBuilder替代StringBuffer,前者速度快。 2) 判断空串,使用if(str == null || str.length() == 0) 替代 if(str== null || \,前者效率高。
另推荐使用org.apache.commons.lang.StringUtils.isBlank(str),因为和if(str == null || str.length() == 0){}等价,但可读性和简洁性更好; 取反的方法StringUtils.isNotBlank(str)。
注意,StringUtils中方法 isBlank 和 isEmpty 的区别如下: StringUtils.isBlank (\StringUtils.isEmpty(\
3) 新增实体,内置类型推荐使用原子类型,原子类型不需要判断null、不需要装箱、占内存少,如int优于Integer。
4) if、else if的组合超过3个else if,考虑使用switch进行替代,效率有所提升。
不推荐的用法:
if (Constant.PAY_METHOD_CASH == payIn.getPayMethod()) { // 现金缴费 busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CASH); } else if (Constant.PAY_METHOD_CHECK == payIn.getPayMethod()) { // 支票缴费 busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CHECK); } else if (Constant.PAY_METHOD_CASH_CHECK == payIn.getPayMethod()) { // 现金+支票缴费 busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CASH_CHECK); } else if (Constant.PAY_METHOD_BANKCARD == payIn.getPayMethod()) { // 银行卡缴费 busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_BANKCARD); } else if (Constant.PAY_METHOD_MOVE_POS == payIn.getPayMethod()) { // 移动POS缴费 busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_MOVE_POS);
24
} else { throw new BusinessException(ErrorCode.PAY_METHOD_IS_ERROR, payIn.getPayMethod()); } 推荐的用法: switch (payIn.getPayMethod()) { case Constant.PAY_METHOD_CASH: // 现金缴费 case Constant.PAY_METHOD_CHECK: // 支票缴费 case Constant.PAY_METHOD_CASH_CHECK: // 现金+支票缴费 case Constant.PAY_METHOD_BANKCARD: // 银行卡缴费 case Constant.PAY_METHOD_MOVE_POS: // 移动POS缴费 default: } throw new BusinessException(ErrorCode.PAY_METHOD_IS_ERROR, payIn.getPayMethod()); busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_MOVE_POS); break; busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_BANKCARD); break; busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CASH_CHECK); break; busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CHECK); break; busiSpecId = busiSpecManager.getBusiSpecId(BusiType.PAYMENT_CASH); break; 5) 返回值为list、map、set类型的,返回空数据结构替代返回null。 推荐的写法:
public List
25