Java属性为什么不能是is开头的boolean

简介: 在Java实体类中,阿里规约要求boolean属性不应以is开头。文章通过实际案例分析了isUpdate字段在JSON序列化过程中变为update的问题,并提供了自定义get方法或使用@JSONField注解两种解决方案,建议遵循规约避免此类问题。

通常定义Java实体类时,对于boolean属性,阿里规约中明确要求不能使用is开头。

至于为什么,我们稍后再讲。

这里先讲一下前几天在工作中,项目遇到的一个问题。库表中某个字段存入了一个实体类的json字符串,在查询库表后,需要将json字符串转为实体类对象进行更改后再转为json字符串后返回给前端。

在这当中就出现了一个问题,库表中存入的数据明明是isUpdate的字段,可是在返回到前端后的代码就是update

这个问题,起初并没有想到是字段定义的问题,通过一步一步的debug,最后才发现是实体类中isUpdate字段的问题,在通过json解析后就转成了update返回给了前端。

下面讲一下,为什么会出现isUpdate变成update的问题。


首先,我们先定义一个Java实体类,包含一个is开头的属性,如isSuccess,再使用idea自动生成的get/set,看看是什么样子。

typescript

代码解读

复制代码

public class IsEntity1 {

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

然后再定义一个Java实体类,不是用is开头的属性,如success,再使用idea自动生成的get/set,看看是什么样子。

typescript

代码解读

复制代码

public class IsEntity2 {

    private boolean success;

    public boolean isSuccess() {
        return success;
    }

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

此时,会发现无论你是用is开头或者不用is开头定义属性,使用idea自动生成的get/set都是一个样子的,而且在setSuccess的时候,会将is省略掉。这里就是项目中遇到的问题所在。

因为当类进行序列化时,有些框架的序列化会根据JavaBean的属性进行序列化,而部分框架是根据JavaBean的getter方法进行序列化,这就会导致在反序列化时与实体类的属性对应不上。

比如说将IsEntity1转换为json字符串时,会根据实体类中的get方法进行序列化取isSuccess的值,而使用idea自动生成的get方法直接就是public boolean isSuccess()方法,在取值的时候会认定success是字段名,就会取成success,与原来定义的字段不同。

如果非要使用is开头来定义字段,怎么才能保证json解析过程是正确的呢


答案是自己写get方法,不用idea自动生成的get方法。

如下:

typescript

代码解读

复制代码

public boolean getIsSuccess() {
	return isSuccess;
}

这样,再将实体类转为json字符串时,就会认定isSuccess是字段名。

还有一种方法,就是使用JSONField注解

ini

代码解读

复制代码

    @JSONField(name = "isSuccess")
    private boolean isSuccess;

虽然这些方法都可以解决json解析过程丢失is的问题,但是为了避免出现这种问题,我们最好还是遵守规约,不使用is开头定义字段。


转载来源:https://juejin.cn/post/7277376062576754751

相关文章
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
33 2
|
7月前
|
Java Apache
Java将一个对象的属性复制到另一个对象
【5月更文挑战第18天】Java将一个对象的属性复制到另一个对象
780 2
|
7月前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
86 4
|
2月前
|
Java
Java 集合存在相同属性,其他元素累加
Java 集合存在相同属性,其他元素累加
33 0
|
3月前
|
Java 编译器 测试技术
|
4月前
|
JSON 前端开发 JavaScript
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
这篇文章讨论了前端Vue应用向后端Spring Boot服务传输数据时发生的类型不匹配问题,即后端期望接收的字段类型为`int`,而前端实际传输的类型为`Boolean`,导致无法反序列化的问题,并提供了问题的诊断和解决方案。
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
|
6月前
|
存储 缓存 Java
探索 Java 中 `Class.java` 的属性与方法
探索 Java 中 `Class.java` 的属性与方法
|
6月前
|
Java Apache
Java将一个对象的属性复制到另一个对象,如何编码
【6月更文挑战第15天】Java将一个对象的属性复制到另一个对象,如何编码
394 3
|
6月前
|
Java Maven
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
|
6月前
|
Java
java反射-属性赋值取值
java反射-属性赋值取值