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()方法输出堆栈信息。
以上:祝愿各位遵守规范,多摸鱼。毕竟你可能需要交接别人的代码呢?哈哈