浅谈Java对象禁止使用基本类型
作者:靖节先生
1. 关于POJO类属性为基本类型存在的问题
在项目开发中遇到的问题,定义POJO类的时候有些属性定义为了基本数据类型,比如long,short,int,double,float等数据相关的属性,导致在创建对象的时候,明明没有set值,却使用了默认值,导致数据构建错误,甚至存储,更新数据出错。
2. Java开发手册关于POJO类属性规范
阿里巴巴《Java开发手册》泰山版,编程规约,OOP规约,第12条规定:
12.关于基本数据类型与包装数据类型的使用标准如下:
1) 【强制】所有的 POJO 类属性必须使用包装数据类型。
2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。
3) 【推荐】所有的局部变量使用基本数据类型。
说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。
正例:数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
反例:某业务的交易报表上显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线-。所以包装数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。
总结来说就是POJO类禁止使用基本数据类型,手册中给的案例是交易的时候有些数据null具有特殊含义,会做特殊处理,比如rpc调用失败,异常退出等,但是如果采用的是基本数据类型就会跳过这些逻辑处理,因为基本数据类型具有默认值。
3. 基本数据类型默认值
1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。
2、单精度浮点型(float)的基本类型变量的默认值为0.0f。
3、双精度浮点型(double)的基本类型变量的默认值为0.0d。
4、字符型(char)的基本类型变量的默认为 “/u0000”。
5、布尔性的基本类型变量的默认值为 false。
6、引用类型的变量是默认值为 null。
7、数组引用类型的变量的默认值为 null。除关键数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
4. 测试验证
User对象
package com.zrj.tools.framework.entity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * 用户对象 * * @author zrj * @since 2022/11/29 **/ @Data @Builder @NoArgsConstructor @AllArgsConstructor public class User { private Long id; private String name; private int age; private long phone; private short phone2; private double userTime; private float totalTime; }
BeanUtils
package com.zrj.tools.framework.utils; import cn.hutool.core.bean.BeanUtil; import com.zrj.tools.framework.entity.Customer; import com.zrj.tools.framework.entity.User; /** * 对象构建 * * @author zrj * @since 2023/1/4 **/ public class BeanUtils extends BeanUtil { /** * 对象的基本数据类型带有默认值,导致不赋值时依然被默认赋值 * * @param args */ public static void main(String[] args) { User user = User.builder().id(18L).name("jerry").build(); //输出结果:User(id=18, name=jerry, age=0, phone=0, phone2=0, userTime=0.0, totalTime=0.0) System.out.println(user); Customer customer = convert(user, Customer.class); System.out.println(customer); } /** * 基于hutool的对象拷贝 * * @param source 源对象 * @param target 目标对象 * @param ignoreProperties 忽略的字段 * @param <T> * @return */ public static <T> T convert(Object source, Class<T> target, String... ignoreProperties) { if (source == null) { return null; } try { T t = target.newInstance(); copyProperties(source, t, ignoreProperties); return t; } catch (Exception e) { throw new RuntimeException(e); } } }
初始化构建的对象,基本类型会被赋默认值。
到此这篇关于浅谈Java对象禁止使用基本类型的文章就介绍到这了,更多相关Java对象禁止使用基本类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!