开发规范当中容易忽视的规则记录
1.抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类名开始,以Test结尾。
2.POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误
3.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
4.枚举中不能定义NAME的枚举值或name域变量。
5.如果是形容能力的接口名称,取对应的形容词做接口名
6.枚举类名带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开
7. 领域模型命名规约
1) 数据对象:xxxDO,xxx即为数据表名。
2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
3) 展示对象:xxxVO,xxx一般为网页名称。
4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
8.不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
9.在 long 或者 Long 赋值时,数值后使用大写的 L
10.共享常量放在constant包的常量类下,根据共享范围确定constant包所处项目的位置
11.左大括号前加空格,保留字与小括号之间加空格
12.注释的双斜线与注释内容之间有且仅有一个空格。
13.方法参数在定义和传入时,多个参数逗号后边必须加空格。
14.不使用float,统一使用double
15.浮点数的计算与比较需使用BigDecimal,且使用参数为字符串的构造器。
16.任何货币金额,均以最小货币单位且整型类型来进行存储
17. 1) 所有的POJO类属性必须使用包装数据类型。
2) RPC方法的返回值和参数必须使用包装数据类型。
3) 所有的局部变量推荐使用基本数据类型。
18.定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。
19.初始化方法不应有初始化逻辑,初始化逻辑应放在init方法中
20.spilit会忽视掉最后两个分隔之间的空值
21.类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
22.日期格式化时,传入pattern中表示年份统一使用小写的y,YYYY对于跨年的周,显示下一年的年份。
23.时间统计场景推荐使用Instant类,获取今年的天数用API,不要写死。
24.获取月份时,为0-11,和常识不同,使用枚举类不易出错,其他情况我们也应该注意,为不明确的数字参数提供见名知意的枚举类。
25.使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出UnsupportedOperationException异常。
26.在使用java.util.stream.Collectors类的toMap()方法转为Map集合时,一定要使用含有参数类型为BinaryOperator,参数名为mergeFunction的方法,否则当出现相同key值时会抛出IllegalStateException异常。
27.判断所有集合内部的元素是否为空,使用isEmpty()方法,而不是size()==0的方式。
28.Collections类返回的对象,如:emptyList()/singletonList()等都是immutable list,不可对其进行添加或者删除元素的操作。
29.ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList;
说明: subList()返回的是ArrayList的内部类SubList,并不是 ArrayList本身,而是ArrayList 的一个视图,对于SubList的所有操作最终会反映到原列表上。
30.使用Arrays.asList()方法将数组转换成集合时,不能进行再修改改集合,因为使用的是适配器模式,后台依然是数组。
31.泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,两者在接口调用赋值的场景中易出错。
32.SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
33.对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。
34.如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。
35.资金相关的金融敏感信息,使用悲观锁策略。
36.使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法被执行到。
37.在高并发场景中,避免使用“等于”判断作为中断或退出的条件,要使用大于或小于,因为在高并发场景下,可能存在跳过判断线的情况。
38.当某个方法的代码总行数超过10行时,return / throw 等中断逻辑的右大括号后需要加一个空行。其实我个人一度有在方法中加N个空行来区分不同逻辑的代码段来增加可读性的习惯,后来改正了。
39.条件判断时不要用过于复杂的语句生成布尔值应提前将判断逻辑赋值给一个命名易于理解的布尔变量。
40.接口入参保护,这种场景常见的是用做批量操作的接口,考虑调用方可能存在的各种传参情况,对自己的接口入参进行预防性的保护。
41.方法内部多行注释使用/* */注释。
42.不要同时在try与finally中使用return,会丢弃try代码块中的返回点。