孤尽班第15天 -- Java代码避坑指南

孤尽班第15天 -- Java代码避坑指南,第1张

孤尽班第15天 -- Java代码避坑指南 浮点数据避坑

浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

  • BigDecimal的等值比较应使用compareTo方法,而不是equals方法
  • equals:此方法会比较值和精度(1.0与1.00返回结果为false)
  • compareTo:会忽略精度

 禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象

IEEE二进制浮点数算数标准(IEEE754)

  • 是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
  • 该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。
日期数据的处理

日期数据类型

JAVA中传统日期API

  • Date: 表示特定的瞬间,精确到毫秒
  • SimpleDateFormat: 继承DateFormat类,主要用来进行格式转换
  • Calendar: 一个工具类,为特定瞬间和一组日历字段之间的转换以及 *** 作日历字段提供了方法。

问题:

  • 所有的日期类型都是线程不安全的。
  • 日期、时间、时间戳没有明确对应的类。
  • 对于格式化和解析的需求(JDK提供了java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求)

 JAVA8新增日期API

  • LocalDate: 代表日期
  • LocalTime: 代表时刻
  • LocalDateTime: 代表具体时间
  • Instant: 代表的是时间戳

优势:

  • 不变性:线程安全
  • 关注点分离:时间日期都有对应的类
  • 清晰:在所有的类中,方法都被明确定义,用以完成相同的行为
  • 实用 *** 作:所有新的日期/时间API类都实现了一系列方法,用以完成通用的任务。

日期格式化需要注意的问题

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

小写yyyy:表示当天所在的年

大写YYYY:代表是week in which year (JDK7之后引入的概念)

意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。

 日期格式化需要注意的问题

在日期格式中分清楚大写的M和小写的m,大写的H和小写的h分别指代的意义

1. 表示月份是大写的M

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

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

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

日期处理需要注意的问题

  • System.currentTimeMills();而不要用new Date().getTime(); 后者还是会调用前者
  • 如果想获取更加精确的纳秒级时间值,使用System.nanoTime的方式
  • 在JDK8中,针对统计时间等场景,推荐使用Instant类

控制语句的避坑规范

在if/else/for/while/do语句中必须使用大括号

表达式异常的分支时,少用if-else方式

控制语句强制规约

三目运算符高度注意类型对齐时,可能抛出因自动拆箱导致的NPE异常

condition ? expresion1 : expression2

说明:以下两种场景会触发类型对齐的拆箱 *** 作:

1. 表达式1或表达式2的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型

2. 表示式1或表达式2的值只要有一个是原始类型。

控制语句好习惯

  • 不要在其它表达式(尤其是条件表达式)中,插入赋值语句
  • 不要在条件判断中执行其它复杂的语句,以提高可读性
  • 避免采用取反逻辑运算符(!(x >= 1),写成x < 1不好吗)
  • 必须取反逻辑运算 ???
在高并发场景中控制语句规约 

在高并发场景中,避免使用“等于”判断作为中断或退出的条件。如果并发控制没有处理好,容易产生等值判断被击穿的情况,使用大于或小于的区间判断条件来代替

 需要参与校验的场合

1. 调用频次低的方法

2. 执行时间开销很大的方法。此情形中,参数校验时间几乎可以忽略不计,但如果因为参数错误导致中间执行回退,或者错误,那得不偿失。

3. 需要极高稳定性和可用性的方法

4. 对外提供的开放接口,不管是RPC/API/HTTP接口

5. 敏感权限入口

6. 公开接口需要进行入参保护,尤其是批量 *** 作的接口。

不需要参数校验的场合

1. 极有可能被循环调用的方法(但在方法说明里必须注明外部参数检查)

2. 底层调用频度比较高的方法(毕竟是像纯净水过滤的最后一道,参数错误不太可能到底层才会暴露问题。一般DAO层与Service层都在同一个应用中,部署在同一台服务器中,所以DAO的参数校验,可以省略)

3. 被声明成private(被声明成private只会被自己代码所调用的方法,如果能够确定调用方法的代码传入参数已经做过检查或者肯定不会有问题,此时可以不校验参数)

credit:图片均引自无尘老师的PPT。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5434104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存