浅谈Java对象禁止使用基本类型
作者:靖节先生 发布时间:2022-11-07 19:59:04
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);
}
}
}
初始化构建的对象,基本类型会被赋默认值。
来源:https://blog.csdn.net/m0_37583655/article/details/128598092
猜你喜欢
- 解决My eclipse 工程发布时端口占用问题如果运行后如图的错,需要进行如下操作来解决:a:打开cmd,输入netstat -ano 找
- 这篇文章主要介绍了Java Collection集合iterator方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 1:Maven命令下载源码和javadocs当在IDE中使用Maven时如果想要看引用的jar包中类的源码和javadoc需要通过maven
- 这篇文章主要介绍了Java开发工具IntelliJ IDEA安装图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 目录一、String的用法1.构造方法2.求字符串长度和某一位置字符3.提取子串4.字符串比较5.字符串链接6.字符串中单个字符查找7.大小
- 查了网上的资料,有比较全面的,但有一个问题就是容易出现一个文字和框子不符合的现象。(仔细看,蓝色字母和背景的灰色有空白)要消除这个空白,很简
- 前言人类建造迷宫已有5000年的历史。在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相
- 在Web应用系统开发中,文件上传和下载功能是非常常用的
- 一、日志的分类1、名字分类log4j :log for java (因为for和4读音差不多,所以交log4j)logBack 日志说明注意
- 测试类中的问题和解决思路问题在测试类中,每个测试方法都有以下两行代码:ApplicationContext ac = new ClassPa
- 工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,
- 目录目标为什么操作步骤工程截图运行效果完整源代码目标在SpringBoot中集成内存数据库H2.为什么像H2、hsqldb、derby、sq
- 详解HDFS多文件Join操作的实例最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left J
- 一、NIOjava.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所
- 动态内存管理为什么存在动态内存分配我们到现在为止掌握的是什么样的内存开辟方式呢//创建一个变量int val = 20; &n
- 1、阿里云DNS的SDK依赖<dependency> <groupId>com.aliyu
- SessionSession对象用于获取与数据库的物理连接。 Session对象是重量轻,设计了一个互动是需要与数据库每次被实例化。持久化对
- 同时使用and和or的查询UserServiceImpl 类,service实现类import org.springframework.be
- 本文实例为大家分享了SpringBoot实现分页功能的具体代码,供大家参考,具体内容如下新建demo\src\main\java\com\e
- 线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。设置线程优先级有助于帮助线程规划器