5. 阿里巴巴程序员开发手册黄山版( 二 )


【5. 阿里巴巴程序员开发手册黄山版】任何货币金额,均以最小货币单位且为整型类型进行存储 。浮点数之间的等值判断,基本数据类型不能使用 == 进行比较,包装数据类型不能使用 进行判断 。浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式 。二进制无法精确表示大部分的十进制小数 。
指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的 。或者使用 来定义值,再进行浮点数的运算操作 。的等值比较应使用 () 方法,而不是 () 方法 。() 方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 () 则会忽略精度 。
构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中 。当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 >/方法 。说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有 和 DAO 的/方法放在类体最后 。
final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:
1)不允许被继承的类,如: 类 。
2)不允许修改引用的域对象,如:POJO 类的域变量 。
3)不允许被覆写的方法,如:POJO 类的方法 。
4)不允许运行过程中重新赋值的局部变量 。
5)避免上下文重复使用一个变量,使用 final 关键字可以强制重新定义一个变量,方便更好地进行重构 。
禁止在程序中写死一年为 365 天,避免在公历闰年时出现日期转换错误或程序逻辑错误 。
避免公历闰年 2 月问题 。闰年的 2 月份有 29 天,一年后的那一天不可能是 2 月 29 日 。
判断所有集合内部的元素是否为空,使用 () 方法(时间复杂度更低可读写好),而不是 size() == 0 的方式 。高并发时,同步调用应该去考量锁的性能损耗 。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁 。对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁 。在使用阻塞等待获取锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在中无法解锁 。
在使用尝试机制来获取锁的方式中,进入业务代码块之前,必须先判断当前线程是否持有锁 。锁的释放规则与锁的阻塞等待方式相同 。并发修改同一记录时,避免更新丢失,需要加锁 。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用作为更新依据 。
在一个块内,每个 case 要么通过/ break /等来终止,要么注释说明
程序将继续执行到哪一个 case 为止;在一个块内,都必须包含一个语句并且放在最后,即使它什么代码也没有 。在 if / else / for / while / do 语句中必须使用大括号 。
三目运算符? 表达式 1:表达式 2 中,高度注意表达式 1 和 2 在类型对齐时,可能抛出因自动拆箱导致的 NPE 异常 。在高并发场景中,避免使用“等于”判断作为中断或退出的条件 。
类、类属性、类方法的注释必须使用规范,使用 /** 内容 */ 格式,不得使用 // xxx
方式 。所有的抽象方法(包括接口中的方法)必须要用注释、除了返回值、参数异常说明外,还必须指出该方法做什么事情,实现什么功能 。所有的类都必须添加创建者和创建日期 。方法内部单行注释,在被注释语句上方另起一行,使用 // 注释 。方法内部多行注释使用 /* */注释,注意与代码对齐 。