1. getter setter 的问题
有次开发中使用FastJson时出现了个bug,说是类里面没有某个属性,debug后发现它默认通过get方法取出属性值,也就是说FastJson默认通过JavaBean规范进行对象序列化。
所以命名方法时若不是类的getter/setter方法时,不要以get或set为前缀命名。
测试:
public class FastJsonTest {
public static void main(String[] args) {
// json转对象
String jsonStr = "{\"name\":\"张三\"}";
Student student = JSON.parseObject(jsonStr, Student.class);
System.out.println("json转对象: "+student.toString());
// 对象转json
Student student1 = new Student();
student1.setName("张三");
String jsonString = JSONObject.toJSONString(student1);
System.out.println("对象转json: "+jsonString);
}
}
class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 无Grade属性
public Integer getGrade() {
return 100;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
输出:
json转对象: Student{name='张三'}
对象转json: {"grade":100,"name":"张三"}
类中写了个getGrade方法,被认为是有一个Grade属性,这样在其它地方使用可能会有问题。
2. 布尔类型属性名不能以is开头
【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列 化错误。
说明:在本文MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx的命名方式,所以,需要在 <resultMap>设置从 is_xxx到xxx的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
引自:Java开发手册(泰山版)编程规约,命名风格一节。
如果以 Boolean isDeleted 命名属性,那它对应getter方法的正确写法应该是isIsDeleted(),但是最好避免这样写。