在《阿里巴巴Java开发手册》中,对于如何选择POJO中的变量类型和RPC接口中的返回值类型也有一些规定:这里强制使用包装类型。是什么原因?让我们看一个简单的代码:/***@authorHollis*/publicclassBooleanMainTest{publicstaticvoidmain(String[]args){Modelmodel1=newModel();System.out.println("默认型号:"+model1);}}classModel{/***设置一个boolean类型的success成员变量*/privateBooleansuccess;/***设置一个boolean类型的failure成员变量*/privatebooleanfailure;/***使用Java8StringJoiner覆盖toString方法*/@OverridepublicStringtoString(){returnnewStringJoiner(",",Model.class.getSimpleName()+"[","]").add(“成功=”+成功).add(“失败=”+失败).toString();上面代码的输出是:defaultmodel:Model[success=null,failure=false]可以看出,当我们不设置Model对象的字段值时,布尔类型变量默认值会被设置为null,boolean类型变量的默认值会被设置为false,即布尔对象的默认值为null,boolean基本数据类型的默认值为false。也就是说wrapper类型默认值为null,而基本数据类型默认值为固定值,比如boolean为false,byte,short,int,long为0,float为0.0f,ETC。;我们再举一个扣费的例子,我们在做一个扣费系统。在扣费的时候,我们需要通过RPC请求从外部定价系统中读取一个费率值。我们期望该接口的返回值将包含一个浮点率字段。当我们得到这个值的时候,我们用公式:金额*费率=手续费来计算,扣除计算结果。如果计费系统异常,可能会返回一个默认值。如果字段为Double类型,则默认值为null,如果字段为double类型,则默认值为0.0。如果扣费系统没有对rate的返回值做特殊处理,计算得到空值会直接报错阻塞程序。如果得到0.0,可以直接计算,接口为0后,扣手续费。这种异常是察觉不到的。有人说,那我可以对0.0进行特殊判断,如果是0,我也可以屏蔽掉报错。然而,这时候出现了一个问题。允许rate为0的场景如何处理?因此,使用基本数据类型只会让解决方案越来越复杂,陷阱也会越来越多。这种使用wrapper类型定义变量的方式通过异常阻塞程序,然后可以识别到这种在线问题。如果使用基本数据类型,系统可能不会报错,然后认为没有异常。当然,以上选择是针对一些电商、支付、金融等场景,可以牺牲临时可用性。对于一些软件系统来说,数据不准确是可以容忍的,但如果系统不可用就另当别论了。.以上就是要求在POJOs和RPCs的返回值中使用wrapper类型的原因。
