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

本文探讨了Java中布尔类型变量的命名规范,建议避免使用`is`前缀,以防止某些框架在序列化和反序列化过程中可能出现的问题。通过示例展示了Fastjson、Gson和Jackson在处理`isSuccess`这样的属性时的不同行为,强调了遵循JavaBeans规则的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

布尔类型变量命名success VS isSuccess

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

理由:

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

72f0b3c7971e

类型Boolean 属性success

72f0b3c7971e

类型Boolean 属性isSuccess

72f0b3c7971e

类型boolean 属性是isSuccess

72f0b3c7971e

类型boolean 属性是success

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

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

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

72f0b3c7971e

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));

}

}

72f0b3c7971e

运行结果

结论

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));

}

}

72f0b3c7971e

运行结果

同一个对象 分别用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));

}

}

72f0b3c7971e

运行结果

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值