浅谈Java对象禁止使用基本类型

 更新时间:2023年02月03日 11:03:45   作者:靖节先生  
本文主要介绍了浅谈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对象禁止使用基本类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中BigDecimal序列化科学计数法前端展示问题踩坑实战

    Java中BigDecimal序列化科学计数法前端展示问题踩坑实战

    BigDecimal是处理高精度的浮点数运算的常用的一个类当需要将BigDecimal中保存的浮点数值打印出来,这篇文章主要给大家介绍了关于Java中BigDecimal序列化科学计数法前端展示问题踩坑的相关资料,需要的朋友可以参考下
    2024-04-04
  • java根据不同的参数调用不同的实现类操作

    java根据不同的参数调用不同的实现类操作

    这篇文章主要介绍了java根据不同的参数调用不同的实现类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java开发学习之Bean的生命周期详解

    Java开发学习之Bean的生命周期详解

    从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲Bean的生命周期,感兴趣的可以学习一下
    2022-06-06
  • 在java中main函数如何调用外部非static方法

    在java中main函数如何调用外部非static方法

    这篇文章主要介绍了在java中main函数如何调用外部非static方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Spring接口版本控制方案及RequestMappingHandlerMapping接口介绍(最新推荐)

    Spring接口版本控制方案及RequestMappingHandlerMapping接口介绍(最新推荐)

    RequestMappingHandlerMapping接口是Spring MVC中的一个核心组件,负责处理请求映射和处理器的匹配这篇文章主要介绍了Spring接口版本控制方案及RequestMappingHandlerMapping接口介绍,需要的朋友可以参考下
    2024-07-07
  • 简单理解Java的垃圾回收机制与finalize方法的作用

    简单理解Java的垃圾回收机制与finalize方法的作用

    这篇文章主要介绍了简单理解Java的垃圾回收机制与finalize方法的作用,着重讲解了Java的GC销毁对象的过程,需要的朋友可以参考下
    2015-11-11
  • Java并发编程之LongAdder执行情况解析

    Java并发编程之LongAdder执行情况解析

    这篇文章主要为大家介绍了Java并发编程之LongAdder执行情况解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • SpringBoot Schedule调度任务的动态管理

    SpringBoot Schedule调度任务的动态管理

    Scheduled定时任务是Spring boot自身提供的功能,所以不需要引入Maven依赖包,下面这篇文章主要给大家介绍了关于SpringBoot通过@Scheduled实现定时任务以及问题解决的相关资料,需要的朋友可以参考下
    2023-02-02
  • SpringBoot mybatis-plus使用json字段实战指南

    SpringBoot mybatis-plus使用json字段实战指南

    在现代应用开发中经常会使用JSON格式存储和传输数据,为了便捷地处理数据库中的JSON字段,MyBatis-Plus提供了强大的JSON处理器,这篇文章主要给大家介绍了关于SpringBoot mybatis-plus使用json字段的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java SpringBoot Validation用法案例详解

    Java SpringBoot Validation用法案例详解

    这篇文章主要介绍了Java SpringBoot Validation用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论