孤尽T31项目Day15
编码避坑指南
1 浮点数处理
单精度存储:先整数部分转二进制,小数部分= 2的-n次幂相加。
精确的小数存储-dicimal:
MySQL:decimal(M,D) M:总长 D:小数长
JAVA:java.math.BigDicimal类
1.1 避坑指南
1、浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equal比较。
避坑:用差值小于某极小数的方法。
- BigDecimal的等值比较应该使用compareTo()方法,而不是equals()方式。
- equals():方法会比较值和精度(1.0与1.00返回结果位false)
- compareTo()会忽略精度。
2、禁止使用构造方法BigDecimal(double)的方式直接把double值转为BigDecimal对象。
BigDicamal b = new BigDicimal( val: 3.1d);
System.out.println(b);
3.100000000xxxxxx(后面会保留double的最大长度)
2 日期数据处理
Java传统日期API
- Date: 表示特定的瞬间,精确到毫秒
- SimpleDateFormate: 继承DateFormat类,主要用来格式转换
- Calender: 一个工具类,为特定瞬间和一组日历字段之间的转换以及操作日历段提供了方法
- 问题:所有的日期都是线程不安全的;日期、时间、时间戳没有明确对应的类;对于格式化和解析的需求。
Java8新增的日期API
- LocalDate: 日期 2021-11-09
- LocalTime: 时刻 12:00:00
- LocalDateTime: 具体时间 2021-11-09 12:00:00
- 线程安全,日期时间都有对应的类,方法被明确定义。
2.1避坑指南
1、日期格式化时,传入的pattern的日期表示年份的统一用小写的y。大写的Y表示当前周所在年份
2、各个字母大小写有不同的意思:
- M:月份
- m:分钟
- H:24小时
- h:12小时
3、取毫秒数:使用System.currentTimeMillis(),不要多走一步用new Date().getTime()。Date()也是调用的这个方法。
4、纳秒级:使用System.nanoTime
5、在JDK8中,针对统计时间等场景,推荐使用Instant类
3 控制语句的避坑规范
3.1 switch
1、每个Case要么使用continue/break/return等来终止,要么注释说明程序执行到哪一个case会被终止。
2、在一个Switch块内,都必须包含一个default在最后。
3、当switch括号内的变量类型为String并且此变量为外部参数时,必须先进行null判断
4、if/else/for/while/for语句都必须使用大括号,这样可读性高,表达异常的分支时,少使用if-else方式
3.2 三目运算符
三目运算符高度注意类型对齐时,可能抛出因自动拆箱导致的NPE异常。
以下两种情况可能触发类型对齐的拆箱操作:
1、表达式1或者表达式2的值只要有一个是原始类型:如果一个是int一个是Integer,Integer会被拆箱为int
2、表达式1和表达式2的值类型不一致,会强制拆箱升级成表示范围更大的那个类型
int a = 1;
Integer b = null;
Integer c = false?a:b
因为a时int类型,b会强制拆箱成int类型,抛出NPE异常
3.3 控制语句好习惯
1、不要在条件表达式中插入赋值语句
2、不要在条件表达式中进行及其复杂的判断语句,以提高可读性
3、避免采用反逻辑运算符
3.4 高并发场景控制语句规约
1、避免使用等于来作为中断或者推出的条件。否则可能被”击穿“,用大于或者小于的判断条件来代替。
3.5 参数校验
①需要参数校验的场合
1、调用频次低的方法
2、执行时间开销很大的方法
3、需要极高稳定性和可用性的方法
4、对外提供的开放接口
5、敏感权限入口
6、公共接口需要入参保护,尤其是批量操作的接口
②不需要参数校验的
1、极有可能会被循环调用的方法。在循环外就应该做好参数的判断
2、底层调用频次高的方法,不能到底层才暴露问题
3、被声明为private的方法,因为私有的,入参前就应该检查
4 OOP设计
OOP:Object-Oriented Programming 面向对象编程
4.1 面向对象的四大特征
抽象:对需求进行业务抽象和建模分析,通过模型的行为组合共同去解决一个问题
封装:对象功能内聚的表现形式,使模块之间的耦合度变低,更加具有维护性
继承:继承使子类能够继承父类,获得父类的部分属性和而行为,使模块更有复用性
多态:使模块在复用基础上更加具有拓展性,使系统更加有想象空间
4.2 七大设计原则
单一原则;里氏替换原则;接口隔离原则;组合复用原则;依赖倒置原则;迪米特原则;开闭原则。
详细见Day1内容孤尽T31项目Day1
4.3 OOP规约
1、方法重写:所有的覆写方法,必须加@Override注解,防止写错。
2、可变参数:避免使用Object,必须写在参数的最后面。尽量不用可变参数。
3、对象比较:所有的整型包装类对象之间值的比较,全部使用equals方法比较;应使用常量或确定有值的对象来调用equals(),防止NPE
所有的POJO类属性比较使用包装类.
4、方法及属性:
1)左右POJO类属性必须使用包装数据类型
2)定义DO、DTO、VO等POJO类的时候,不要设定任何属性默认值
3)定义数据对象DO时,属性类型要与数据库字段类型相匹配。
4)getter/setter方法中,不要添加业务逻辑
5)禁止在POJO类中,同时存在对应属性XXX的sXxx()和getXxx()方法。
6)构造方法里面不要加业务逻辑,需要的话加载在init方法中