478 lines
13 KiB
Markdown
478 lines
13 KiB
Markdown
# JAVA 语言编码规范
|
||
|
||
## 4.1 命名规范
|
||
### 规则1.1(强制)
|
||
标识符由字母、数字、下划线和美元符($)组成,不能包含@、%和空格等特殊字符,不能以下划线、数字或美元符号开始或结束,不能是Java关键字,区分大小写。
|
||
|
||
### 规则1.2(强制)
|
||
各种命名应使用正确的英文拼写和语法,避免拼音、混合拼写、不规范缩写、中文命名。
|
||
|
||
### 规则1.3(强制)
|
||
包名统一小写,点分隔符间一个自然语义单词,词意从大到小,前缀顶级域名,项目包名以com.psbc.开头。
|
||
|
||
### 规则1.4(强制)
|
||
类名使用UpperCamelCase命名方式,简洁且富于描述。
|
||
|
||
### 规则1.5(建议)
|
||
抽象类命名建议Abstract开头,异常类Exception结尾,测试类Test结尾,设计模式体现于类名。
|
||
|
||
### 规则1.6(强制)
|
||
方法名使用lowerCamelCase命名方式。
|
||
|
||
### 规则1.7(强制)
|
||
常量命名全大写,单词间下划线隔开,语义完整清楚。
|
||
|
||
### 规则1.8(建议)
|
||
布尔类型实例变量命名不使用is前缀。
|
||
|
||
### 规则1.9(强制)
|
||
参数名、实例变量、局部变量使用lowerCamelCase命名方式。
|
||
|
||
### 规则1.10(强制)
|
||
类型与中括号紧挨表示数组。
|
||
|
||
### 规则1.11(强制)
|
||
避免子父类成员变量、不同代码块局部变量相同命名。
|
||
|
||
### 规则1.12(建议)
|
||
自定义编程元素命名尽量完整单词组合。
|
||
|
||
### 规则1.13(建议)
|
||
常量、变量命名表示类型名词放词尾。
|
||
|
||
### 规则1.14(建议)
|
||
接口类方法、属性不加修饰符号,简洁并加Javadoc注释,接口少定义变量。
|
||
|
||
### 规则1.15(强制)
|
||
Service和DAO类基于SOA理念,暴露服务是接口,内部实现类用Impl后缀。
|
||
|
||
### 规则1.16(建议)
|
||
形容词接口名用形容词,如–able结尾。
|
||
|
||
### 规则1.17(建议)
|
||
枚举类名带Enum后缀,成员名称全大写,单词间下划线隔开。
|
||
|
||
### 规则1.18(建议)
|
||
a) Service/DAO层方法命名:
|
||
1)获取单个对象用get前缀;
|
||
2)获取多个对象用list前缀,复数结尾;
|
||
3)获取统计值用count前缀;
|
||
4)插入用save/insert前缀;
|
||
5)删除用remove/delete前缀;
|
||
6)修改用update前缀。
|
||
b) 领域模型命名:
|
||
1)领域对象以xxxDO/DTO/VO命名;
|
||
2)避免以POJO结尾实体对象或值对象命名。
|
||
|
||
## 4.2 格式规范
|
||
### 规则2.1(强制)
|
||
源文件编码UTF-8,Unix换行符。
|
||
|
||
### 规则2.2(建议)
|
||
除注释外,方法签名等总行数不超过80行。
|
||
|
||
### 规则2.3(强制)
|
||
类文件组成部分顺序:文件头注释、包引入、类声明、常量、变量、构造函数、方法。
|
||
|
||
### 规则2.4(建议)
|
||
多个构造函数或同名方法应顺序在一起。
|
||
|
||
### 规则2.5(建议)
|
||
方法按功能而非作用域或访问权限分组。
|
||
|
||
### 规则2.6(强制)
|
||
引用类时禁止用*引入包全部类,避免无用、重复引用,不import java.lang和同包类。
|
||
|
||
### 规则2.7(强制)
|
||
Java关键字正确顺序:public、protected、private、abstract、static、final、transient、volatile、synchronized、native。
|
||
|
||
### 规则2.8(建议)
|
||
避免多余关键字,接口方法属性不加修饰符号。
|
||
|
||
### 规则2.9(强制)
|
||
每行至多一条语句。
|
||
|
||
### 规则2.10(强制)
|
||
大括号使用约定:
|
||
a)左大括号前不换行;
|
||
b)左大括号后换行;
|
||
c)右大括号前换行;
|
||
d)右大括号后有else等代码不换行,终止后必须换行;
|
||
e)大括号内为空,简洁写成{},不换行。
|
||
|
||
### 规则2.11(建议)
|
||
缩进采用4个空格,多行变量声明赋值不强制等号对齐,tab设为4空格宽度。
|
||
|
||
### 规则2.12(建议)
|
||
单行字符数不超过120,换行原则:
|
||
a)第二行相对第一行缩进4空格,第三行起不再缩进;
|
||
b)运算符与下文换行;
|
||
c)点符号与下文换行;
|
||
d)方法调用参数多需换行时,在逗号后换行;
|
||
e)括号前不换行。
|
||
|
||
### 规则2.13(建议)
|
||
用空行分隔逻辑相关代码段,提高可读性,不插入多个空行。
|
||
|
||
## 4.3 注释规范
|
||
### 规则3.1(建议)
|
||
类、属性、方法注释使用Javadoc格式。
|
||
|
||
### 规则3.2(强制)
|
||
公共API代码必须编写JavaDoc注释,类、属性、方法、参数、返回值、异常全部注释。
|
||
|
||
## 4.4 常量变量
|
||
### 规则4.1(建议)
|
||
避免使用魔法数,应定义为常量。
|
||
|
||
### 规则4.2(强制)
|
||
长整型常量后使用大写字母“L”。
|
||
|
||
### 规则4.3(建议)
|
||
浮点数类型数值后缀统一为大写D或F。
|
||
|
||
### 规则4.4(建议)
|
||
按功能或模块归类常量。
|
||
|
||
### 规则4.5(建议)
|
||
常量复用层次分为五层:跨应用、应用内、子工程内、包内、类内。
|
||
|
||
### 规则4.6(建议)
|
||
变量值在固定范围变化时用enum类型。
|
||
|
||
### 规则4.7(强制)
|
||
每行只声明一个变量。
|
||
|
||
### 规则4.8(建议)
|
||
局部变量声明时初始化。
|
||
|
||
### 规则4.9(强制)
|
||
避免一个语句中给多个变量赋相同值,不用内嵌赋值运算符。
|
||
|
||
### 规则4.10(强制)
|
||
避免局部变量覆盖上一级变量。
|
||
|
||
### 规则4.11(强制)
|
||
数组类型变量声明采用数据类型[]的方式。
|
||
|
||
## 4.5 控制语句
|
||
### 规则5.1(强制)
|
||
switch括号内为String且为外部参数时,先进行null判断。
|
||
|
||
### 规则5.2(强制)
|
||
每个switch语句包含default分支,且default在最后。
|
||
|
||
### 规则5.3(强制)
|
||
if/else/for/while/do语句中必须使用大括号。
|
||
|
||
### 规则5.4(建议)
|
||
避免不可达的else if和else分支。
|
||
|
||
### 规则5.5(强制)
|
||
条件表达式尽量简化。
|
||
|
||
### 规则5.6(建议)
|
||
返回表达式尽量简化。
|
||
|
||
### 规则5.7(建议)
|
||
避免在循环中重复执行相同内容。
|
||
|
||
### 规则5.8(建议)
|
||
慎用非短路逻辑运算符。
|
||
|
||
### 规则5.9(建议)
|
||
含多种运算符的表达式中使用圆括号。
|
||
|
||
### 规则5.10(建议)
|
||
三元运算符前的表达式需加圆括号。
|
||
|
||
### 规则5.11(建议)
|
||
复杂条件判断结果赋值给布尔变量。
|
||
|
||
## 4.6 面向对象
|
||
### 规则6.1(强制)
|
||
禁止用类的实例对象引用访问静态变量或方法。
|
||
|
||
### 规则6.2(强制)
|
||
覆写方法必须加@Override注解。
|
||
|
||
### 规则6.3(强制)
|
||
覆写equals必须覆写hashCode。
|
||
|
||
### 规则6.4(建议)
|
||
过时接口或方法加@Deprecated注解。
|
||
|
||
### 规则6.5(建议)
|
||
避免使用过时类或方法。
|
||
|
||
### 规则6.6(建议)
|
||
慎用可变参数编程。
|
||
|
||
### 规则6.7(建议)
|
||
用常量或确定有值的对象调用equals。
|
||
|
||
### 规则6.8(建议)
|
||
参数个数相同的方法重载时,避免用自动转换类型,建议用不同方法名。
|
||
|
||
### 规则6.9(建议)
|
||
使用final关键字的情况:
|
||
a)不允许继承的类;
|
||
b)不允许修改引用的域对象;
|
||
c)不允许重写的方法;
|
||
d)不允许重新赋值的局部变量;
|
||
e)避免重复使用变量。
|
||
|
||
### 规则6.10(建议)
|
||
慎用Object的clone方法。
|
||
|
||
### 规则6.11(强制)
|
||
类成员变量访问控制从严。
|
||
|
||
### 规则6.12(建议)
|
||
类方法访问控制从严。
|
||
|
||
### 规则6.13(强制)
|
||
构造方法中避免处理业务逻辑,初始化逻辑放init方法。
|
||
|
||
### 规则6.14(强制)
|
||
RPC方法返回值和参数用包装类型。
|
||
|
||
### 规则6.15(建议)
|
||
局部变量用基本类型。
|
||
|
||
### 规则6.16(建议)
|
||
POJO类不设定属性默认值。
|
||
|
||
### 规则6.17(强制)
|
||
POJO类必须写toString方法。
|
||
|
||
### 规则6.18(强制)
|
||
POJO类禁止同时存在isXxx和getXxx方法。
|
||
|
||
### 规则6.19(建议)
|
||
setter中参数名与成员变量名一致,this.成员名=参数名。getter/setter中不加业务逻辑。
|
||
|
||
### 规则6.20(强制)
|
||
序列化类新增属性时不修改serialVersionUID,不兼容升级时修改。
|
||
|
||
## 4.7 数值计算
|
||
### 规则7.1(强制)
|
||
比较字符串用equals,不用==或!=。
|
||
|
||
### 规则7.2(强制)
|
||
避免自动类型转换导致溢出或精度丢失。
|
||
|
||
### 规则7.3(建议)
|
||
避免高精度转低精度溢出。
|
||
|
||
### 规则7.4(强制)
|
||
禁止用BigDecimal(double)构造,用String构造或valueOf。
|
||
|
||
### 规则7.5(强制)
|
||
精确计算用BigDecimal,不用浮点数。
|
||
|
||
### 规则7.6(强制)
|
||
与NaN比较用isNaN(),不用==或!=。
|
||
|
||
### 规则7.7(强制)
|
||
自增自减运算符使用要产生实际影响。
|
||
|
||
### 规则7.8(强制)
|
||
BigDecimal比较用compareTo,不用equals。
|
||
|
||
### 规则7.9(强制)
|
||
SimpleDateFormat非线程安全,不用在并发环境。JDK8及以上用DateTimeFormatter。
|
||
|
||
### 规则7.10(强制)
|
||
日期格式化Pattern统一规范。
|
||
|
||
### 规则7.11(建议)
|
||
三目运算符注意类型对齐可能引发空指针。
|
||
|
||
## 4.8 集合规范
|
||
### 规则8.1(建议)
|
||
慎用ArrayList.subList。
|
||
|
||
### 规则8.2(建议)
|
||
慎用Arrays.asList。
|
||
|
||
### 规则8.3(强制)
|
||
集合转数组用toArray(T[] array),传入长度为0的空数组。
|
||
|
||
### 规则8.4(强制)
|
||
禁止集合中添加自身。
|
||
|
||
### 规则8.5(强制)
|
||
foreach循环中不做remove/add操作,用Iterator。
|
||
|
||
### 规则8.6(建议)
|
||
参照常用Map集合K/V存储null情况。
|
||
|
||
### 规则8.7(建议)
|
||
合理利用集合的有序性和稳定性。
|
||
|
||
### 规则8.8(强制)
|
||
集合明确泛型。
|
||
|
||
### 规则8.9(建议)
|
||
判断集合元素是否为空用isEmpty,不用size()==0。
|
||
|
||
### 规则8.10(强制)
|
||
toMap()方法必须用带mergeFunction的。
|
||
|
||
### 规则8.11(强制)
|
||
toMap()方法中value为NULL时处理。
|
||
|
||
### 规则8.12(强制)
|
||
不可对keySet()/values()/entrySet()返回集合做增删。
|
||
|
||
### 规则8.13(强制)
|
||
排序时Comparator要满足三个条件。
|
||
|
||
## 4.9 线程安全
|
||
### 规则9.1(建议)
|
||
单例获取保证线程安全,推荐饿汉模式。
|
||
|
||
### 规则9.2(建议)
|
||
并发访问的单例禁止有状态成员变量。
|
||
|
||
### 规则9.3(建议)
|
||
创建线程或线程池指定有意义名称。
|
||
|
||
### 规则9.4(建议)
|
||
多个资源加锁保持一致顺序。
|
||
|
||
### 规则9.5(强制)
|
||
CountDownLatch使用确保countDown被执行。
|
||
|
||
### 规则9.6(强制)
|
||
锁在finally中释放。
|
||
|
||
### 规则9.7(强制)
|
||
同步代码中不用public属性。
|
||
|
||
### 规则9.8(强制)
|
||
占用锁时不调用Thread.sleep。
|
||
|
||
### 规则9.9(建议)
|
||
并发场景用线程安全集合。
|
||
|
||
### 规则9.10(强制)
|
||
线程资源通过线程池提供,不显式创建。
|
||
|
||
### 规则9.11(建议)
|
||
线程池用ThreadPoolExecutor,不用Executors。
|
||
|
||
### 规则9.12(建议)
|
||
高并发避免用“等于”判断,用区间判断。
|
||
|
||
## 4.10 异常处理
|
||
### 规则10.1(强制)
|
||
可通过预检查避免的RuntimeException不捕获。
|
||
|
||
### 规则10.2(建议)
|
||
不用异常做流程控制。
|
||
|
||
### 规则10.3(建议)
|
||
finally中不使用return。
|
||
|
||
### 规则10.4(强制)
|
||
非稳定代码catch区分异常类型。
|
||
|
||
### 规则10.5(强制)
|
||
捕获异常要处理,不抛弃,最外层业务使用者处理异常。
|
||
|
||
### 规则10.6(强制)
|
||
try在事务代码中,catch后手动回滚事务。
|
||
|
||
### 规则10.7(强制)
|
||
finally中关闭资源,JDK7+用try-with-resources。
|
||
|
||
### 规则10.8(建议)
|
||
捕获与抛出异常类型匹配。
|
||
|
||
### 规则10.9(建议)
|
||
捕获异常区分Exception和Error。
|
||
|
||
## 4.11 日志规范
|
||
### 规则11.1(强制)
|
||
应用用日志框架(SLF4J)API,不用直接用Log4j、Logback API。
|
||
|
||
### 规则11.2(强制)
|
||
禁止用System.out.print等方法,用标准日志框架。
|
||
|
||
### 规则11.3(建议)
|
||
日志用占位符,不用“+”拼接。
|
||
|
||
### 规则11.4(建议)
|
||
日志级别分为FATAL、ERROR、WARN、INFO、DEBUG,各级别使用建议。
|
||
|
||
### 规则11.5(建议)
|
||
info/debug日志进行开关判断。
|
||
|
||
### 规则11.6(强制)
|
||
日志中用户敏感信息脱敏。
|
||
|
||
### 规则11.7(建议)
|
||
日志打印参数中避免复杂表达式。
|
||
|
||
## 4.12 性能相关
|
||
### 规则13.1(建议)
|
||
同步调用优先用无锁数据结构,锁代码块尽可能小。
|
||
|
||
### 规则13.2(建议)
|
||
避免频繁创建可复用资源。
|
||
|
||
### 规则13.3(建议)
|
||
避免创建不必要的对象。
|
||
|
||
### 规则13.4(建议)
|
||
避免变量重复计算。
|
||
|
||
### 规则13.5(建议)
|
||
try/catch放在循环外层。
|
||
|
||
### 规则13.6(建议)
|
||
池化重量级资源。
|
||
|
||
### 规则13.7(建议)
|
||
遍历Map用entrySet,JDK8+用Map.foreach。
|
||
|
||
### 规则13.8(建议)
|
||
用Set去重,不用List的contains。
|
||
|
||
### 规则13.9(建议)
|
||
慎用递归,必须时保证出口可执行。
|
||
|
||
### 规则13.10(建议)
|
||
用观察者模式替换无限轮询。
|
||
|
||
### 规则13.11(建议)
|
||
缓存不常变化数据。
|
||
|
||
### 规则13.12(建议)
|
||
字符串拼接用StringBuilder或StringBuffer。
|
||
|
||
### 规则13.13(建议)
|
||
数组拷贝用System.arraycopy。
|
||
|
||
### 规则13.14(建议)
|
||
合理使用单例。
|
||
|
||
### 规则13.15(建议)
|
||
避免随意用静态变量。
|
||
|
||
### 规则13.16(建议)
|
||
未发生线程安全时用HashMap、ArrayList。
|
||
|
||
### 规则13.17(建议)
|
||
避免用二维数组。
|
||
|
||
### 规则13.18(建议)
|
||
合理使用线性表和链表。
|
||
|
||
### 规则13.19(建议)
|
||
避免非常大的内存分配。
|
||
|
||
### 规则13.20(建议)
|
||
正则表达式编译后复用。 |