在阿里巴巴Java开发手册中,对于如何选择POJO中的变量类型也有规定:这里强制使用封装类型,请问是什么原因呢?我们来看一段简单的代码**定义一个boolean类型的success成员变量*/privateBooleansuccess;/***定义一个boolean类型的failure成员变量*/privatebooleanfailure;/***重写toString方法,使用Java8的StringJoiner*/@OverridepublicStringtoString(){returnnewStringJoiner(",",Model.class.getSimpleName()+"[","]").add("success="+success).add("failure="+failure).toString();}}的上面代码的输出是:defaultmodel:Model[success=null,failure=false]可以看出,当我们不设置Model对象的字段值时,布尔类型变量会设置默认值为null,布尔类型变量会将默认值设置为false。即对象的默认值为null,boolean基本数据类型的默认值为false。也就是说wrapper类型默认值为null,而基本数据类型默认值为固定值,比如boolean为false,byte,short,int,long为0,float为0.0f,ETC。;再举一个扣费的例子,我们在做一个扣费系统。在扣除费用时,我们需要从外部定价系统中读取费率值。我们期望该接口的返回值将包含一个浮点率字段。当我们得到这个值的时候,我们用公式:金额*费率=手续费来计算,扣除计算结果。如果计费系统异常,可能会返回一个默认值。如果字段为Double类型,则默认值为null,如果字段为double类型,则默认值为0.0。如果扣费系统没有对rate的返回值做特殊处理,计算得到空值会直接报错阻塞程序。如果得到0.0,可以直接计算,接口为0后,扣手续费。这种异常是察觉不到的。有人说,那我可以对0.0进行特殊判断,如果是0,我也可以屏蔽掉报错。然而,这时候出现了一个问题。允许rate为0的场景如何处理?因此,使用基本数据类型只会让解决方案越来越复杂,陷阱也会越来越多。这种使用wrapper类型定义变量的方式通过异常阻塞程序,然后可以识别到这种在线问题。如果使用基本数据类型,系统可能不会报错,然后认为没有异常。以上就是为什么建议在POJO和RPC返回值中使用包装器类型。
