孤尽T31项目Day15

孤尽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方法中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值