T31项目第15天
今天是孤尽班学习的第15天,今天跟着无尘老师学习 浮点数的处理、控制语句的处理、日期类数据的处理、参数校验规则、OPP的编程原则,感谢老师们的辛勤付出,我会继续努力,加油。
项目开发规约
1.浮点数据处理
浮点型数据(float,double):精确度比整形数据精确度低,会存在精度损失问题
java中处理货币应该以整形来存储,以货币的最小单位进行存储,例如 以分为单位,表示时除以100来表示单位元
1.1 浮点数据问题
在数据转换中会出现精度的损失
foloat 有效数据值为23,double的有效数据值为53
例如:5.2F(十进制)转换为二进制保存
转换过程:
1.先转换整数部分 5 转换为 101
2.小数部分使用乘2除整法:0.0011001…
3.将转换的数值进行科学计数法进行格式化处理
将整数部分转换为整数部分只有一位1,将幂指数增增加为整数部分右移动的部分,初始指数为1,现在指数为2,
101.0011001 转换为1.010011001
将小数部分010011001填充到 有效数值中
,4.移码公式:将整数部分 2+(128-1)=129,2为整数位数值
1.2 java精确的浮点存储
数据库中定义数据类型:decimal(M,D)
整数部分M存储 0-65,小数部分位数D小于M
java中定义数据类型 java.lang.BigDecimal
判断两个浮点数是否相等只用判断是两个数的差异在一定的范围内,
例如:
float a=1.0F-0.9F
float b=0.9F-0.8F
float diff=1e-6F
if Math.abs(a-b<diff){
System.out.printf(“true”)
}
1.3 浮点数值的使用注意事项
比较浮点数值使用 conpare()比较只会比较数值(-1 不相等,0 相等)
equals 会比较精度同时也会比较数值
禁止使用将 double类型转换为BigDecimal类型
IEEE754 浮点数据计算标准
2.日期类型数据处理
2.1日期数据类型
2.2 传统日期类的问题
传统日期类是不安全的,类中定义的属性没有final修饰
例如Data:private static BaseCalendar jcal;
日期、时间、时间戳没有明确的对应的类
不能满足格式化和解析的需求
2.3新增API的特性
线程是安全,属性添加了final,初始属性之后不可更改
关注点分离:时间日期都有响应的类
结构清晰,所有的类中,方法都定义完成相同行为
实用操作:实现一系列方法完成通用任务
2.4日期格式化的问题
日期格式化是,传入patten的年份使用 小写y表示
YYYY 表示 本周当前年(跨年的周会让年数产生变化)
yyyy表示 当天当前年
M(月份) 和 m(分钟)
H (24小时类)和h(12小时类)
2.5获取当前毫秒数
new Data().getTime()毫秒
System.nanoTime()纳秒
统计日期使用System.instant
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 控制语句的规约
1.同一个类中定义多个属性为不同的类型包装类,系统会把所有包装类型拆包为同一类型
,会抛出空指针异常
例如:
Interger a=1;
Interger b=2;
Interger c=null;
Boolean flag=false;
Interger result=flag?a*b:c;
2.不要其他表达式中插入赋值语句(条件判断),赋值会导致条件判断出错和实际不符合
不要在条件判断中增加复杂的语句,提高可读性
3.不要使用取反逻辑,提高代码可阅读性
例如
if(x>52)
if(!(x<=52))
3.3 高并发中的控制语句
使用区间来判断 不能使用等于来判断,会导致当前值被击穿
场景:对于秒杀场景中使用 数据库底层来处理 和 java处理判断库存数量,
数据库判断更新库存
@UPDATE(update store set count=count-1 where id=#{id} and (count-1)>=0)
Interger updateById(@Pagram(id)Interger id)
java业务层判断更新库存
if((count-1)<=1){ Throw Exception}
建议使用数据层判断,数据库语句执行只会锁住当前行,java处理则会锁住整个表
4 程序中参数校验
4.1需要参数校验的场合
1.使用频次较低的方法
2.执行时间很长的方法,避免参数错误,导致程序执行消耗资源
3.需要极其稳定性和可用性的方法
4.对外提供的开发接口(RPC/API/HTTP)
5.公开接口进行入参保护,尤其是批量操作接口
4.2不需要参数校验的场合
循环调用的方法:必须注明外部参数检查
底层调用频繁的方法:例如同一台服务中service 和dao层的参数传递,dao层参数校验可以忽略
被private修饰的方法或者参数
5. OOP
5.1面向对象编程定义
特性:继承、封装、多态
特点:可维护性,可重用性,可扩展性
5.2面向对象编程注意点
1.所有的覆盖方法需要加 @OverWriter
2.相同参数类型,相同业务含义
3.避免使用Object,定义类型
4.可变参数放在参数列表的最后
5.尽量不要使用可变参数
6.对象比较使用常量的值来比较,避免出现NPE
例如:“test.”.equel(Object)
5.3 需要检验参数场合
1.所有的pojo类属性必须使用包装类型赋值
2.定义DO/DTO/VO 等POJO类时,不要设定任何属性的默认值
3.定义数据对象DO类时,竖向类型要与数据库类型相匹配
4.getter 和 setter 方法 不要增加业务逻辑
5.禁止在POJO中,同事存在属性 的is()和get*()方法
6.构造方法中禁止添加任何业务逻辑,如需添加初始化逻辑,在外部构建一个初始化方法,在将初始化方法置入 构造方法中