背景
自从Java支持自动装箱、拆箱,开发中对基本数据类型和包装类型的使用就更加的随意了。但在系统设计中,有时候还是会就纠结是用int还是Integer,使用boolean还是Boolean。 有时候似乎两个都可以,有时候又不自觉地偏爱其中一个。
探索
不自觉地偏爱,背后肯定存在其逻辑,只是工期紧没去深究。
数据包装类型包含一些类型转换的方法就不提了,基本数据类型强转也能做到。为什么需要纠结需要选择使用哪种,在于包装数据类型比基本数据类型多了一个NULL值。如果在业务场景中,某个字段的值一定不为NULL,那选择基本数据类型或是包装数据类型都可以。如果某个字段的值可能为NULL,那就不得不使用包装数据类型了。
举个例子,mybatis的自动生成的update接口为啥返回值是int而不是Integer。接口返回的是更新成功的记录条数,既然是记录条数,那么只有两个结果,要么是0,更新失败,要么是n(n>0),更新成功。不存在为NULL。有同学说,如果内部抛异常返回NULL呢?额...,内部抛异常肯定就直接透传到调用层来,返回NULL没有意义,接口语义不好,又把异常吃掉了增加问题排查难度。
再举个例子,为商城设计一个优惠券金额字段,假设存储的单位是分。类型设计成long还是Long呢。回归业务需求,商城为了促销增加了优惠券功能,促销结束就会关闭优惠券功能。那优惠券金额可能为NULL吗?显而易见,优惠券可能为NULL,应该选择Long类型。
总结
一句话总结,字段设计选择基本数据类型或者对应的包装类型,在于业务需求中是否允许字段为空。字段可以为空,选择包装类型,反之,选择基本数据类型。