关于基本数据类型与包装数据类型的使用标准如下:1)【强制】所有的POJO类属性必须使用包装数据类型。2)【强制】RPC方法的返回值和参数必须使用包装数据类型。3) 【推荐】所有的局部变量使用基本数据类型。【说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。正例:数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险。反例:比如显示成交总额涨跌情况,即正负x%,x为基本数据类型,调用的RPC服务,调用不成功时,返回的是默认值,页面显示为0%,这是不合理的,应该显示成中划线。所以包装数据类型的null值,能够表示额外的信息,如:远程调用失败,异常退出。】
定义 DO/DTO/VO等POJO类时,不要设定任何属性默认值。【反例:POJO 类的 createTime 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。】
序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。(说明:注意serialVersionUID不一致会抛出序列化运行时异常。)
构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
POJO类必须写toString方法。使用IDE中的工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。【说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题】
禁止在POJO类中,同时存在对应属性xxx的isXxx()和getXxx()方法。【说明:框架在调用属性 xxx 的提取方法时,并不能确定哪个方法一定是被优先调用到】
使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险
当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条
类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
在getter/setter方法中,不要增加业务逻辑,增加排查问题的难度
循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
final可以声明类(不允许被继承的类,如String类)、成员变量(不允许修改引用的域对象)、方法、以及本地变量(不允许运行过程中重新赋值的局部变量),避免上下文重复使用一个变量,使用final可以强制重新定义一个变量,方便更好地进行重构
慎用Object的clone方法来拷贝对象,对象clone方法默认是浅拷贝,若想实现深拷贝需覆写clone方法实现域对象的深度遍历式拷贝。
类成员与方法访问控制从严。1)如果不允许外部直接通过new来创建对象,那么构造方法必须是private。2)工具类不允许有public或default构造方法。3)类非static 成员变量并且与子类共享,必须是protected。 4)类非static成员变量并且仅在本类使用,必须是private。5)类static成员变量如果仅在本类使用,必须是private。 6)若是static成员变量,考虑是否为final。7)类成员方法只供类内部调用,必须是 private。8)类成员方法只对继承类公开,那么限制为protected。【说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦】
浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals 来判断。【浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式】
// 反例 float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; if (a == b) { // 预期进入此代码快,执行其它业务逻辑 // 但事实上 a==b 的结果为 false } Float x = Float.valueOf(a); Float y = Float.valueOf(b); if (x.equals(y)) { // 预期进入此代码快,执行其它业务逻辑 // 但事实上 equals 的结果为 false } // 正例 // (1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的 float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; float diff = 1e-6f; if (Math.abs(a - b) < diff) { System.out.println("true"); } // (2)使用BigDecimal来定义值,再进行浮点数的运算操作 // BigDecimal构造的时候注意事项 见上文 BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); BigDecimal c = new BigDecimal("0.8"); BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); if (x.equals(y)) { System.out.println("true"); } (五) 集合处理