目录
四、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 的空数组