Java代码闭坑指南
「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
1. 浮点数据的处理
1.1 浮点型数据类型的问题
货币数据类型的选择:
- 任何货币金额,均以最小单位且整数类型进行存储
浮点数问题根源: 精度丢失
- 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断
- BigDecimal的等值比较应使用compareTo方法,而不是equals方法
- equals:此方法会比较值和精度(1.0与1.00返回结果为false)
- compareTo:会忽略精度
2. 日期数据的处理
2.1传统日期类的问题
传统日期类是不安全的,类中定义的属性没有final修饰 例如Data:private static BaseCalendar jcal; 日期、时间、时间戳没有明确的对应的类 不能满足格式化和解析的需求
2.2新增API的特性
线程是安全,属性添加了final,初始属性之后不可更改 关注点分离:时间日期都有响应的类 结构清晰,所有的类中,方法都定义完成相同行为 实用操作:实现一系列方法完成通用任务
2.3日期格式化的问题
日期格式化是,传入patten的年份使用 小写y表示 YYYY 表示 本周当前年(跨年的周会让年数产生变化) yyyy表示 当天当前年 M(月份) 和 m(分钟) H (24小时类)和h(12小时类)
2.4 日期处理需要注意的问题
3. 控制语句的避坑规范
3.1控制语句Switch
每个case使用continue/case/return 来终止 添加注释说明程序执行以哪一个case结束 switch块内在呢个价default 放在最后来处理异常 swith应该对判断的值增加空指针异常处理,当值为空指针时,不会执行switch语块,会直接抛出NPE错误
3.2 控制语句if/else
if/else/for/while/do 语句必须使用大括号,保证代码的统一简洁,为了后期维护 异常分支少用if else(if else 属于嵌套,会存在异常)
3.3高并发中的控制语句
高并发场景中,避免使用“等于”判断作为终端或退出的条件 若并发控制没有做好,容易产生等值判断被“击穿”,使用区间判断代替
3.4 需要参数校验的场合
- 调用频次低的方法
- 执行时间开销很大的方法。
- 需要极高稳定性和可用性的方法
- 对外提供的开放接口,包括RPC/API/HTTP接口
- 敏感权限入口
- 公开接口需要进行入参保护,尤其是批量操作的接口
3.5无需参数校验的场合
1、极有可能被循环调用的方法
2、底层调用频度比较高的方法
3、被声明成private