2月22-23日工作情况

First Post:

Last Update:

2月22-23日工作情况

读书摘阅

最近开始读一本书,阿里技术团队出的《Java开发手册(黄山版)》,希望对自己Java开发会有所帮助。

这本书主要是介绍了阿里内部的Java开发规范,用三个级别来区别:强制、推荐、参考。

6.【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

正例:”test”.equals(param);

反例:param.equals(“test”);

说明:推荐使用 JDK7 引入的工具类 java.util.Objects#equals(Object a, Object b)

8.【强制】任何货币金额,均以最小货币单位且为整型类型进行存储。

9.【强制】浮点数之间的等值判断,基本数据类型不能使用 == 进行比较,包装数据类型不能使用 equals 进行判断。

说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表 示大部分的十进制小数,具体原理参考《码出高效》。

反例:

float a = 1.0F - 0.9F;

float b = 0.9F - 0.8F;

if (a == b) {

​ // 预期进入此代码块,执行其它业务逻辑

​ // 但事实上 a == b 的结果为 false

}

Float x = Float.valueOf(a);

Float y = Float.valueOf(b);

if (x.equals(y)) {

​ // 预期进入此代码块,执行其它业务逻辑

​ // 但事实上 equals 的结果为 false

}

正例:

(1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的

float a = 1.0F - 0.9F;

float b = 0.9F - 0.8F;

float diff = 1e-6F;

if (Math.abs(a - b) < diff) {

​ System.out.println(“true”);

}

(2)使用 BigDecimal 来定义值,再进行浮点数的运算操作。

BigDecimal a = new BigDecimal(“1.0”);

BigDecimal b = new BigDecimal(“0.9”);

BigDecimal c = new BigDecimal(“0.8”);

BigDecimal x = a.subtract(b);

BigDecimal y = b.subtract(c);

if (x.compareTo(y) == 0) {

​ System.out.println(“true”);

}

10.【强制】BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。

说明:equals() 方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo() 则会忽略精度。

14.【强制】定义 DO / PO / DTO / VO 等 POJO 类时,不要设定任何属性默认值。 反例:某业务的 DO 的 createTime 默认值为 new Date();但是这个属性在数据提取时并没有置入具体值,在更新其 它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

16.【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

1.【强制】日期格式化时,传入 pattern 中表示年份统一使用小写的 y。

说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念), 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY 就是下一年。

正例:表示日期和时间的格式如下所示: new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”)

反例:某程序员因使用 YYYY/MM/dd 进行日期格式化,2017/12/31 执行结果为 2018/12/31,造成线上故障。

2.【强制】在日期格式中分清楚大写的 M 和小写的 m,大写的 H 和小写的 h 分别指代的意义。

说明:日期格式中的这两对字母表意如下:

1)表示月份是大写的 M

2)表示分钟则是小写的 m

3)24 小时制的是大写的 H

4)12 小时制的则是小写的 h

7.【强制】Collections 类返回的对象,如:emptyList() / singletonList() 等都是 immutable list,不可 对其进行添加或者删除元素的操作。

反例:如果查询无结果,返回 Collections.emptyList() 空集合对象,调用方一旦在返回的集合中进行了添加元素的操 作,就会触发 UnsupportedOperationException 异常。

关于注解

今天在读到一篇关于幂等校验的文章时候,刚好提到用注解的区分是否进行拦截校验,打通了之前对注解用法的困惑:如果方法/类(在定义时候就已经规定好了)用到了注解,在一些拦截判断的时候就可以根据方法/类有无这个注解执行相应的逻辑了。

注解的定义:

image-20240223132132547

拦截器通过注解尝试获取方法是否为空来看有没有注解:

image-20240223132240442