一、技术栈规约
二、命名规范
三、Java代码规范(注释规范、异常与日志、代码逻辑规范)
四、Mybatis与SQL规范
五、结果检查(单元测试及代码扫描)
六、安全规范
/**
* <Description> <br>
* @author mazhicheng@5i5j.com<br>
* @version 1.0<br>
* @date ${YEAR}/${MONTH}/${DAY} <br>
*/
/**
*缓存key-value并设定过期时间
* @param key 缓存对象的key
* @param valueList 缓存对象
* @return 缓存是否成功
*/
<T> boolean addList(String key, List<T> valueList);
* @see com.wiwj.common.cache.redis.JedisSentinelPoolUtil
*/
@Deprecated
public class JedisUtils {…}
禁止catch里不做任何记录和处理,吞掉异常及其堆栈信息
禁止: logger.error(“XXX操作异常”) 或 logger.error(“XXX操作异常”+e) 或 e.printStackTrace()
正确: logger.error("XXX操作异常", e)
private static final Logger log = LoggerFactory.getLogger(OrganizationServiceImpl.class);
如采用了lombok,可用 @Slf4j 注解替代以上声明。
正确写法如:
log.debug("当前用户id: {} ,操作对象: {}=>{} ", userId, objectType, objectId);
或条件输出形式如:
if(log.isDebugEnabled()){
log.debug("当前用户id: “+id+” ,操作对象: “+ objectType +”=> “+ objectId);
}
(无用的代码会干扰团队成员的阅读/或被误调,越积越多会导致代码维护成本增高)
public class MyEntity implements Serializable {
private static final long serialVersionUID = 123456L;
...
}
避免NPE(NullPointException)的一些建议:
equals比较将非空对象前置:如 "true".equals(request.getParameter("isXx")),即使后者为空也不会导致NPE。
数据库字段可空的映射属性使用包装类型定义:如基本数据类型的int映射到数据库的null值将产生NPE,而用吧包装类型 Integer 则不会。
可能为空的变量进行必要判空,并在非预期条件下打印必要的跟踪日志,不但避免NPE,还非常便于跟踪调试。如:
级联调用 obj.getA().getB().getC() 易产生 NPE,先进行判空或使用 JDK8 的 Optional 类包装。
调用Dubbo接口拿到返回值时,进行判空。
封装统一的判空类用于常用类型的判空,代码需要判空时统一调用即可。如 XX.isEmpty(), XX.isNotEmpty()
当代码中存在大量重复代码时,一旦代码逻辑变动将很容易导致顾此失彼,产生bug,非常不利于维护。
// 错误的示例:
for(Long id : idList){
// 循环执行SQL查询或调用外部系统接口,产生性能问题
Entity entity = xxService.getEntityById(id);
...
}
// 此案例的更优方案是 通过idList一次性查询获取到Entity集合,然后转换为Map<Id, Entity>供后续获取。
String name = userService.getUser(id).getName();
Long deptId = userService.getUser(id).getDepeId();
替换为:
User user = userService.getUser(id); String name = user.getName(), ….
CREATE_TIME <= ‘2019-04-14 23:59:59’
CREATE_TIME <= to_date(‘2019-04-14 00:00:00‘,‘yyyy-MM-dd HH24:mi:ss’)
单元测试会在打包前统一运行,可及时发现受影响的代码问题(比如新代码导致了之前的代码逻辑产生问题,如果有单元测试可在打包时及时发现)
Junit单元测试类示例:
public class TestApollo {
@Test // 标记为单元测试方法
public void testApolloConfig(){
String appId = Foundation.app().getAppId();
// 预期结果断言
Assert.assertNotNull(appId);
}
}
原文:https://www.cnblogs.com/edda/p/14826226.html