布尔类型变量命名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!