Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装类型的使用标准

news2024/11/24 15:55:51

场景

Java开发手册中关于POJO的布尔类型的变量名的要求是:

【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要

在<resultMap>设置从 is_xxx 到 xxx 的映射关系。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候,

“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

 

下面来验证下上面的结论。

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个 RPC 接口的时候,

我们一般会定义一个字段表示本次请求是否成功的。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

我们先新建以下四个POJO

Model1 :

public class Model1 {
    private Boolean isSuccess;

    public Boolean getSuccess() {
        return isSuccess;
    }

    public void setSuccess(Boolean success) {
        isSuccess = success;
    }
}

Model2 :

public class Model2 {
    private Boolean success;

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }
}

Model3:

public class Model3 {
    private boolean isSuccess;

    public boolean isSuccess() {
        return isSuccess;
    }

    public void setSuccess(boolean success) {
        isSuccess = success;
    }
}

Model4 :

public class Model4 {
    private boolean success;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }
}

以上四个POJO都是通过IDEA自动生成的get和set方法,可以看到:

基本类型自动生成的 getter 和 setter 方法,名称都是isXXX()和setXXX()形式的。

包装类型自动生成的getter和setter方法,名称都是getXXX()和setXXX()形式的

JavaBean 中关于 setter/getter 的规范

关于 Java Bean 中的 getter/setter 方法的定义其实是有明确的规定的,根据JavaBeans(TM) Specification规定:

JavaBeans(TM) Specification 1.01 Final Release

如果是普通的参数 propertyName,要以以下方式定义其 setter/getter:
        public <PropertyType> get<PropertyName>();
        public void set<PropertyName>(<PropertyType> a);

但是,布尔类型的变量 propertyName 则是单独定义的:
        public boolean is<PropertyName>();
        public void set<PropertyName>(boolean m);

 

通过对照这份 JavaBeans 规范,我们发现,在 Model4 中,变量名为 isSuccess,如果严格按照规范定义的话,

其getter 方法应该叫 isIsSuccess。但是很多IDE 都会默认生成为 isSuccess。

Java中fastJson、jackson、Gson对于POJO的布尔变量isSuccess序列化的影响

拿常用的序列化进行举例,如果需要引入依赖,根据自己项目情况自行引入

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.0</version>
        </dependency>

引入依赖之后,示例代码如下:

        Model3 model3 = new Model3();
        model3.setSuccess(true);
        System.out.println("Serialiazable Result with fashjson:"+com.alibaba.fastjson.JSON.toJSONString(model3));
        com.google.gson.Gson gson = new Gson();
        System.out.println("Serialiazable Result with Gson:"+gson.toJson(model3));
        com.fasterxml.jackson.databind.ObjectMapper om = new ObjectMapper();
        System.out.println("Serialiazable Result with jackson:"+om.writeValueAsString(model3));

以上代码的输出结果为

        //Serialiazable Result with fashjson:{"success":true}
        //Serialiazable Result with Gson:{"isSuccess":true}
        //Serialiazable Result with jackson:{"success":true}

可以看到

在 fastjson 和 jackson 的结果中,原来类中的 isSuccess 字段被序列化成success。

而 Gson 中是 isSuccess 字段。

fastjson 和 jackson 在把对象序列化成 json 字符串的时候,是通过反射遍历出该类中的所有 getter 方法,

得到isSuccess,然后根据 JavaBeans 规则,他会认为这是属性success的值。直接序列化成 json:{"success":true}

但是 Gson 并不是这么做的,他是通过反射遍历该类中的所有属性,并把其值序列化成 json:{“isSuccess”:true}

可以看到,由于不同的序列化工具,在进行序列化的时候使用到的策略是不一样的,

所以,对于同一个类的同一个对象的序列化结果可能是不同的。

如果对于同一个对象,使用fastjson进行序列化,再使用Gson反序列化会发生什么?

测试代码如下:

 System.out.println(gson.fromJson(com.alibaba.fastjson.JSON.toJSONString(model3),Model3.class).isSuccess());

以上输出结果为false

原因是因为 JSON 框架通过扫描所有的 getter后发现有一个isSuccess方法,然后根据JavaBeans的规范,解析出变量名为success,

把 model 对象序列化城字符串后内容为{"success":true}。根据{"success":true}这个 json 串,

Gson 框架在通过解析后,通过反射寻找 Model 类中的 success 属性,

 但是 Model 类中只有 isSuccess 属性,所以,最终反序列化后的 Model 类的对象中,isSuccess 则会使用默认值 false。

所以,在定义 POJO 中的布尔类型的变量时,不要使用 isSuccess 这种形式,而要直接使用 success !

Java的POJO中布尔变量使用基本数据类型boolean还是包装数据类型Boolean

新建一个POJO

import java.util.StringJoiner;

public class Model {
    private Boolean success;
    private boolean failure;

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public boolean isFailure() {
        return failure;
    }

    public void setFailure(boolean failure) {
        this.failure = failure;
    }

    @Override
    public String toString() {
        return new StringJoiner(",",Model.class.getSimpleName()+"[","]")
                .add("success = "+success)
                .add("failure= "+failure)
                .toString();
    }
}

并使用Java 8的StringJoiner重写toString方法。

然后输出该对象的toString

        Model model = new Model();
        System.out.println("default model: "+model);

以上代码输出结果

default model: Model[success = null,failure= false]

可以看到,当我们没有设置 Model 对象的字段的值的时候,Boolean 类型的变量会设置默认值为null,

而 boolean 类型的变量会设置默认值为false。即对象的默认值是null,boolean 基本数据类型的默认值是false。

在 Java 开发手册中,对于 POJO 中如何选择变量的类型也有着一些规定

关于基本数据类型与包装数据类型的使用标准如下:

1) 【强制】所有的 POJO 类属性必须使用包装数据类型。

2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。

3) 【推荐】所有的局部变量使用基本数据类型。

说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。

正例:

数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。

反例:

某业务的交易报表上显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调

用不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线-。所以包装数据类型

的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新版】系统架构设计师 - 知识产权与标准化

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识产权与标准化考点摘要保护范围与对象识产权与保护期限知识产权与知识产权人的确定知识产权与侵权判定标准化&#xff08;标准分类与编号&#xff09; 架构 - 知识产权与标准化 考点摘要 保护…

JavaSE-06 【面向对象+封装】

JavaSE-06 [面向对象封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是把构成…

windows服务器自带IIS搭建网站并发布公网访问的详细教程

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

关于数据生成二维码保存和解密删除二维码

文章目录 前言一、pom配置依赖二、文件引入1.BufferedImageLuminanceSource2.QRCodeUtil3.MyPicConfig4.UploadUtils三、测试前言 所需文件: MyPicConfig 主要解决上传图片实时刷新BufferedImageLuminanceSource 算法文件QRCodeUtil 生成二维码工具类UploadUtils 主要解决上传…

Python中模块的动态导入和自动安装

前言 在 Python 开发中&#xff0c;正确管理和安装所需的第三方模块是至关重要的&#xff0c;但手动处理模块依赖可能会变得繁琐且容易出错。 为了简化这一过程&#xff0c;Python 提供了动态导入和自动安装模块的能力。本文将介绍如何使用动态导入和自动安装模块的方法&#x…

自学黑客技术很难吗?如何自学黑客技术

有人的地方就有江湖&#xff0c;有互联网江湖的地方就有web安全工程师的身影。随着移动互联网的快速发展&#xff0c;网络安全问题成为越来越重要的事情&#xff0c;但由于之前国家对网络安全的不重视&#xff0c;导致网络安全人才严重缺失&#xff0c;所以成为一名网络安全工程…

爱眼护眼的倡导者,康瞳护眼吧引领更多的人关注眼部健康

爱眼护眼的倡导者,康瞳护眼吧引领更多的人关注眼部健康#微信热点#康瞳护眼膏百收网SEO 大家早上好有好消息告诉大家 人民日报连续❷大版面报道&#x1f4f0; 关于 ❝青少年近视眼防控的宣传❞ ——降 低近视率迫在眉睫‼️ 轻体营开营倒计时 ⏰⏰3天⏰⏰ 来此一生&#x…

微信小程序实现生成分享海报案例

一、引入插件painter &#xff08;1&#xff09;克隆地址&#xff1a;https://gitcode.net/mirrors/Kujiale-Mobile/Painter &#xff08;2&#xff09;下载的painter放到小程序的components目录下 二、页面中引入插件 &#xff08;1&#xff09;页面的json文件 "using…

最强总结,Python自动化测试-sign签名实战,精品整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一般公司对外的接…

如何在一周内成为更好的软件测试员?七个步骤带你一步一步晋升...

一、引言 软件测试是确保软件质量的关键步骤&#xff0c;而成为一个更好的软件测试员并非一朝一夕之事。然而&#xff0c;通过对一些关键领域的集中学习和实践&#xff0c;我们可以在短短一周内取得显著的进步。下面&#xff0c;我们将为你提供一周内可以立即执行并取得结果的…

豆瓣评分9.2,最牛R语言实战书升级版来了!

R 作为一个开源项目&#xff0c;在很多操作系统上都可以免费获得&#xff0c;包括 Windows、macOS 和 Linux。不管你用 R 做数据收集、汇总、转换&#xff0c;还是探索、建模、可视化或展示方面的工作&#xff0c;它都可以满足你。 目前 R 已经成为统计、预测分析和数据可视化…

【Protobuf速成指南】.proto文件的编写与编译

文章目录 1.0版本一、编写.proto文件1.文件规范&#xff1a;2.注释方式&#xff1a;3.指定proto3语法&#xff1a;4.package申明符5.定义message6.编写消息字段①类型对照表②唯一编号 二、编译.proto文件1. 编译指令2.源码分析 三、序列化和反序列化的使用四、小结 1.0版本 本…

(基于python)简单实现接口自动化测试

一、简介 本文从一个简单的登录接口测试入手&#xff0c;一步步调整优化接口调用姿势&#xff0c;然后简单讨论了一下接口测试框架的要点&#xff0c;最后介绍了一下我们目前正在使用的接口测试框架pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。 二、引言 …

Volo.Abp升级小记(二)创建全新微服务模块

文章目录 创建模块领域层应用层数据库和仓储控制器配置微服务 测试微服务微服务注册添加资源配置配置网关 运行项目 假设有一个按照 官方sample搭建的微服务项目&#xff0c;并安装好了abp-cli。 需要创建一个名为GDMK.CAH.Common的模块&#xff0c;并在模块中创建标签管理功能…

Redis指令-数据结构String类型和Hash类型

1. String类型 字符串类型&#xff0c;Redis中最简单的存储类型 底层都是字节数组形式存储&#xff0c;只不过是编码方式不同&#xff1b; 字符串类型的最大空间不能超过512m&#xff1b; SET/GET/MSET/MGET使用示例&#xff1a; INCR使用示例&#xff1a; INCRBY自增并指定步长…

GIS在地质灾害危险性评估与灾后重建中的应用

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

摩托车电动车头盔新标准GB811-2022?将于2023年7月1日强制实施!

头部在发生交通事故时受到猛烈撞击&#xff0c;头盔可以有效地保护头部。因为头盔光滑的半球性&#xff0c;可使冲击力分散并吸收冲击力&#xff0c;而头盔的变形或裂纹以及护垫&#xff0c;又起到一个缓冲作用&#xff0c;也能吸收一部分能量。据测算&#xff1a;人的头部一般…

Splashtop 荣获2023年 NAB 展会年度产品奖

2023年4月20日 加利福尼亚州库比蒂诺 Splashtop 在简便快捷的远程办公解决方案方案领域处于领先地位。Splashtop 宣布其 Enterprise 解决方案在2023年 NAB 展会年度产品奖项中荣获远程制作奖。NAB 展会的官方奖励计划旨在表彰参展商在今年的 NAB 展会上展出的一些重要的、有前…

探索Beyond Compare:让文件比较和管理变得简单高效

在这个信息爆炸时代&#xff0c;我们的日常生活和工作中需要处理大量的数据和文档。在这个过程中&#xff0c;有时候我们会面临找出不同文件之间的差异、合并重复内容等需求。那么&#xff0c;有没有一款软件可以帮助我们轻松地完成这些任务呢&#xff1f;答案当然是肯定的&…

SAP从入门到放弃系列之CRP-part3

这边文章主要简单介绍Fiori 应用中关于计划相关的内容如何配置。首先则在Firoi Library中搜索对应的APP&#xff0c;地址如下&#xff1a; https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/# 以订单调度应用为例&#xff0c; SAP Fiori Apps Reference …