1. 规范说明
需遵守的代码风格校验规则总计九大类,具体参考如下:
序号 | 校验分类 | 类型 |
1 | 命名检查 | 强制 |
2 | 常量定义 | 强制 |
3 | 代码格式 | 强制 |
4 | OOP规约 | 强制 |
5 | 数量检查 | 强制 |
6 | 控制语句 | 强制 |
7 | 导入检查 | 强制 |
8 | 注释规约 | 强制 |
9 | 其他 | 强制 |
针对以上9类的输出规范,罗列了相应的说明和正反例,详情可参考如下:
1.1 命名检查
- 类名采用首字母大写的驼峰式。
- 方法名,参数名采用首字母小写的驼峰式。
- 包路径名采用全小写的。
- 数组的声明风格命名统一采用String[] args的方式。
【反例】
//常量建议大写,可辅于下划线private static final String aaa = "test";private static final String BBB="test";private String ccc="test";
//变量名建议首字母小写private String DDD="test";
//数组声明String args[] = new String[8];
【正例】
private static final String AAA= "test";
private static final String BBB="test";
private String ccc="test";
private String ddd="test";
String[] args = new String[8];
1.2 常量定义
- (建议)不采用魔法数,
- 全大写字母:常量名称应全部使用大写字母,单词之间用下划线 _ 分隔。
【反例】
public class Constants {public static final int maxConnections= 100;public static final String defaultUserName= "admin";} // 不好的做法if (count > 100) {// ...}
【正例】
//常量大写下划线
public class Constants {public static final int MAX_CONNECTIONS = 100;public static final String DEFAULT_USER_NAME = "admin";} // 好的做法if (count > Constants.MAX_CONNECTIONS) {// ...}
1.3 代码格式
- if 代码块均必须添加成双成对的大括号,并且左大括号在行尾,右大括号独有一行。
- (建议)方法和构造函数不超过80行。
【反例】
public String getInfo(String userName,Integer code) {//缺少括号if(true)log.info("test");return StringUtils.EMPTY;}
【正例】
public String getInfo(String userName,Integer code) {//括号if(true) {log.info("test");}return StringUtils.EMPTY;}
1.4 OOP规约
- String类型的比较必须采用 equals。
- 避免null.equals("sss")导致的空指针异常。建议将可控制的值放在equals前面
【反例】
public String getInfo(String userName, Integer code) {if (userName == "admin") {}if (userName.equals("admin")) {}return StringUtils.EMPTY;
}
【正例】
public String getInfo(String userName,Integer code) {if("admin".equals(userName)){}if("admin".equals(userName)){}return StringUtils.EMPTY;}
1.5 数量检查
- 方法的入参不超过5个,构造函数除外。
- 方法的return的地方个数不超过10个。
- catch的异常数量尽量不超过3个。
- 抛出的异常数量尽量不超过3个。
- for循环嵌套不超过3层。如超过3层建议拆分
- if嵌套不超过5层。你就想想自己下次能看得懂吗?
【反例】
public String getInfo(String userName,String userId,String userNo,String userInfo,String orderId,String orderNum) throws IOException,FileNotFoundException,RuntimeException{//返回数量if(...){if(...){if(...){return StringUtils.EMPTY;}}}//return关键字超过10个......try {//业务操作......try {//业务操作......try {//业务操作......} catch (RuntimeException e) {......}} catch (Exception e) {...... }}catch (Exception ex){......}return StringUtils.EMPTY;}
【正例】
public String getInfo(UserInfo user) throws Exception{//过多的分支不利于代码阅读,拆分成子方法subMethod1();......subMethod2();return StringUtils.EMPTY;}private String subMethod1(){......}private String subMethod2(){......}private String subMethod3(){......}
1.6 控制语句
- Switch 必须携带Default分支,并且放在末尾。
- 检查是否有过度复杂的布尔表达式,建议最多不超过三个
【反例】
public String getInfo(String userName,Integer code) {//无default分支switch (userName){case "superAdmin":return "-1";case "admin":return "0";}return StringUtils.EMPTY;}//过度复杂的表达式public boolean canUserLogin(User user) {return (user != null &&user.getUsername() != null && !user.getUsername().trim().isEmpty() &&user.getPassword() != null && !user.getPassword().trim().isEmpty() &&user.isActive());}
【正例】
public String getInfo(String userName,Integer code) {//无default分支switch (userName){case "superAdmin":return "-1";case "admin":return "0";default:return "1";}}//精简public boolean canUserLogin(User user) {return ( user != null && user.getUsername() );}
1.7 导入检查
- 对于未使用到的包,及时剔除。
- 避免使用*号进行包的引入。
减少不必要的依赖:显式导入可以减少不必要的依赖,使项目更加轻量。通配符导入可能会引入你实际并不需要的类,增加类加载时间和内存占用
【反例】
//未被使用到
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
//util底下所有包引入
import java.util.*;
【正例】
import java.util.List;
1.8 注释规约
- Java类必须补充注释。
- Java的方法必须具备注释。
- 方法和类 采用 /** @标签 **/ 采用统一的注释格式,行内注释采用//,并且不能放在行尾。
【反例】
//用户用户信息private String getInfo(String userName,String userId){return StringUtils.EMPTY;}
【正例】
/*** 获取用户信息* @param userName 用户名* @param userId 用户ID* @return 返回信息字符串*/private String getInfo(String userName,String userId){return StringUtils.EMPTY;}
1.9 其他
- (建议)尽量不出现TODO的事项,TODO事项建议在提交代码前处理完成。
- 不允许采用system.out方法输出日志。
- 不允许采用e.printStackTrace()方法输出堆栈信息。
以上:祝愿各位遵守规范,多摸鱼。毕竟你可能需要交接别人的代码呢?哈哈