布尔类型变量命名success VS isSuccess

success & isSuccess 皆可,命名都不存在歧义性,但是建议不加is

理由:

1.防止部分框架解析会引起序列化错误 反例:定义为基本数据类型boolean isSuccess; 的属性,它的方法也是isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是success,导致属性获取不到,抛异常

类型Boolean 属性success

类型Boolean 属性isSuccess

类型boolean 属性是isSuccess

类型boolean 属性是success

以上代码的setter/getter是使用Intellij IDEA自动生成的,仔细观察以上代码,发现以下规律:

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

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

setter/getter规范

序列化时出现状况:

情况一:

public class Person implements Serializable {

private static final long serialVersionUID = -7363494335098590947L;

private boolean isSuccess;

public boolean isSuccess() {

return isSuccess;

}

public void setSuccess(boolean success) {

isSuccess = success;

}

public String getName(){

return "4869";

}

}

//主类

public class PropertyNameTest01 {

public static void main(String[] args) throws Exception{

Person person = new Person();

person.setSuccess(true);

//使用fastjson序列化person成字符串并输出

System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(person));

//使用Gson序列化person成字符串并输出

Gson gson =new Gson();

System.out.println("Serializable Result With Gson :" +gson.toJson(person));

//使用jackson序列化person成字符串并输出

ObjectMapper om = new ObjectMapper();

System.out.println("Serializable Result With jackson :" +om.writeValueAsString(person));

}

}

运行结果

结论

fastjson和jackson在把对象序列化成json字符串的时候,是通过反射遍历出该类中的所有getter方法,得到getName和isSuccess,然后根据JavaBeans规则,他会认为这是两个属性name和success的值。直接序列化成json:{"name":"4869","success":true}

Gson是通过反射遍历该类中的所有属性,并把其值序列化成json:{"isSuccess":true}

不同的序列化工具,在进行序列化的时候使用到的策略是不一样的,所以,对于同一个类的同一个对象的序列化结果可能是不同的。

情况二:

public class Person implements Serializable {

private static final long serialVersionUID = -7363494335098590947L;

private boolean isSuccess;

public boolean isSuccess() {

return isSuccess;

}

public void setSuccess(boolean success) {

isSuccess = success;

}

}

//主类

public class PropertyNameTest01 {

public static void main(String[] args) throws Exception{

Person person = new Person();

person.setSuccess(true);

//使用fastjson序列化person成字符串并输出

System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(person));

//使用Gson序列化person成字符串并输出

Gson gson =new Gson();

System.out.println("Serializable Result With Gson :" +gson.toJson(person));

//使用jackson序列化person成字符串并输出

ObjectMapper om = new ObjectMapper();

System.out.println("Serializable Result With jackson :" +om.writeValueAsString(person));

}

}

运行结果

同一个对象 分别用fastjson & gson序列化出现情况

public class Person implements Serializable {

private static final long serialVersionUID = -7363494335098590947L;

private boolean isSuccess;

public boolean isSuccess() {

return isSuccess;

}

public void setSuccess(boolean success) {

isSuccess = success;

}

@Override

public String toString() {

return new StringJoiner(", ", Person.class.getSimpleName() + "[", "]")

.add("isSuccess=" + isSuccess)

.toString();

}

}

//主类

public static void main(String[] args) throws Exception{

Person person = new Person();

person.setSuccess(true);

Gson gson = new Gson();

System.out.println(gson.fromJson(JSON.toJSONString(person),Person.class));

}

}

运行结果

结果完全相反,原因是因为JSON框架通过扫描所有的getter后发现有一个isSuccess方法,然后根据JavaBeans的规范,解析出变量名为success,把person对象序列化城字符串后内容为{"success":true}。

根据{"success":true}这个json串,Gson框架在通过解析后,通过反射寻找Person类中的success属性,但是Person类中只有isSuccess属性,所以,最终反序列化后的Person类的对象中,isSuccess则会使用默认值false。

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

java布尔类型定义_Java如何正确定义布尔类型变量的命名相关推荐

  1. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  2. java 基本类型内存_java基本数据类型、内存分析、装包拆包

    2019-09-13   18:01:23 idea快捷键: file->settings->Keymap->搜索关键字 Increase Font Size   增大字体    c ...

  3. java 枚举类型初始化_java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enumColorSelect { RED_BAGE= 0, GREEN_BAGE, BL ...

  4. java 浮点类型声明_java 浮点数据类型

    Java的浮点类型有两种:float和double.Java的浮点类型有固定的表数范围和字段长度,字段长度和表数范围和机器无关.Java的浮点数遵循IEEE754标准,采用二进制数据的科学计数法来表示 ...

  5. C++基础之布尔类型,什么是C++的布尔类型

    在C语言中,关系运算和逻辑运算的结果有两种,真和假:0 表示假,非 0 表示真.例如: #include <stdio.h>int main(){int a, b, flag;scanf( ...

  6. 布尔类型的值包括( )和( )_布尔类型

    2.4.3布尔类型 布尔类型主要用来表示真值或假值.在Python中,标识符True和False被解释为布尔值.另外,Python中的布尔值可以转化为数值,True 表示1, False 表示0. 说 ...

  7. js布尔类型+数字判断_C ++中的布尔数据类型

    js布尔类型+数字判断 In this article, we'll take a look at the Bool datatype in C++. 在本文中,我们将介绍C ++中的Bool数据类型 ...

  8. 在python中布尔类型的值包括_Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...

  9. Java中Person类型赋值_Java设计:定义一个Person类和它的子类Employee。Person类有姓名、地址、电话号码和电子邮箱,...

    匿名用户 1级 2017-04-26 回答 Person类: public class Person { private String address; private String name; pr ...

最新文章

  1. asp.net MD5 加密
  2. 都是套路!要毁灭人类、喷马斯克、还获得公民身份的机器人Sophia,真相确是...
  3. 灵活运用ISA的链接转换功能:ISA2006系列之十三
  4. 【转载】使用javassist动态注入代码
  5. 2018年12月2526日
  6. http304状态码缓存设置问题
  7. 指针04 - 零基础入门学习C语言44
  8. java继承与覆盖_简单的继承,方法重载与方法覆盖
  9. linux 如何获得后缀_Bugku:杂项 linux
  10. How to fix the bug “Expected required, optional, or repeated.”?
  11. OJ RuntimeError常见原因
  12. 突然吐字不清_要注意说话吐字不清小心是脑中风前兆
  13. The Event System
  14. python切面异常处理_Spring项目中优雅的异常处理
  15. Scala 语言学习之泛型(7)
  16. Zabbix email 配置
  17. Linux/Android——input_handler之evdev (四) 【转】
  18. Hamcrest Tutorial
  19. maxdos网刻教程(傻瓜型)
  20. 音频(四) - 音频压缩(Speex使用Opus简介)

热门文章

  1. 某酷音乐网多线下载工具 v1.0
  2. 异星工厂机器人教程_快速上手指南 - 异星工厂中文维基 | Factorio - 灰机wiki
  3. 怒了,专科学历被歧视?专科这样做照样可以牛掰。
  4. [Github] GitKraken 简体中文翻译补丁
  5. C++出现 error: no match for ‘operator==‘ (operand types are ‘Person‘ and ‘const Person‘)
  6. 省力下载网盘rapidshare、hotfile、megaupload、filesonic、f...
  7. 国内外立法与执法趋势
  8. 给河马刷牙(龙应台)
  9. matlab关于bp神经网络,关于matlab的BP神经网络
  10. ug专属界面如何定制,ug软件如何定制角色