> 文章列表 > 代码规范----编程规约(下)

代码规范----编程规约(下)

代码规范----编程规约(下)

目录

四、OOP规约

五、日期时间

六、集合处理


四、OOP规约

(1)、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可

(2)、所有的覆写方法,必须加@Override 注解

(3)、相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object

              正例:public List<User> listUsers(String type, Long... ids) {...}
(4)、外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生

影响,接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。
(5)、不能使用过时的类或者方法

(6)、Object equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals

(7)、所有整形包装类对象之间值的比较,全部使用equals方法进行判断

(8)、任何货币金额、均以最小货币单位且整形类型来进行存储

(9)、浮点值之间的等值判断,基本数据不能用==来比较,包装数据类型不能用equals方法来判断

               浮点数使用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确的表示大部分的十进制小数

(10)、BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法。

(11)、BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法

(12)、定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配
                数据库字段的bigint 必须与类属性Long类型相对应
(13)、禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象
                这样写的话 存在精度丢失风险
优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了
Double 的 toString,而 Double 的 toString 按 double 的实எ能表达的精度对尾数进行了截断
(14)、

                所有的 POJO 类属性必须使用包装数据类型
                RPC 方法的返回值和参数必须使用包装数据类型
(15)、定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值
(16)、序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果

完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值

(17)、构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中

(18)、POJO 类必须写 toString 方法,使用 IDE 中的工具:source> generate toString

时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString
(19)、禁止在 POJO 类中,同时存在对应属性 xxx isXxx()getXxx()方法

五、日期时间

(1)、日期格式化时,传入 pattern 中表示年份统一使用小写的 y
日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY 就是下一年
(2)、在日期格式中分清楚大写的 M 和小写的 m,大写的 H 和小写的 h 分别指代的意义
(3)、获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime()
(4)、不允许在程序任何地方中使用:
                1)java.sql.Date
                2)java.sql.Time
                3)java.sql.Timestamp
(5)、不要在程序中写死一年为 365 天,避免在公历昧年时出现日期转换错误或程序逻辑

错误

六、集合处理

(1)、关于 hashCode 和 equals 的处理,遵循如下规则:

                1)  只要覆写 equals,就必须覆写 hashCode
                2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须覆写 这两种方法
                3) 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals
说明:String 因为覆写了 hashCode 和 equals 方法,所以可以愉快地将 String 对象作为 key 来使用
(2)、判断所有集合内部的元素是否为空,使用 isEmpty()方法,而不是 size()==0 的方式

说明:在某些集合中,前者的时间复杂度为 O(1),而且可读性更好
(3)、在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要使

用含有参数类型为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key
值时会抛出 IllegalStateException 异常
(4)、在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要注

意当 value 为 null 时会抛 NPE 异常
(5)、ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException

常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList
(6)、使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时,不可以对其进行添

加元素操作,否则会抛出 UnsupportedOperationException 异常

(7)、Collections 类返回的对象,如:emptyList()/singletonList()等都是 immutable list

不可对其进行添加或者删除元素的操作
(8)、在 subList 场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、

增加、删除产生 ConcurrentModificationException 异常
(9)、使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一

致、长度为 0 的空数组