1. getter setter 的問題
有次開發(fā)中使用FastJson時(shí)出現(xiàn)了個(gè)bug,說是類里面沒有某個(gè)屬性,debug后發(fā)現(xiàn)它默認(rèn)通過get方法取出屬性值,也就是說FastJson默認(rèn)通過JavaBean規(guī)范進(jìn)行對(duì)象序列化。
所以命名方法時(shí)若不是類的getter/setter方法時(shí),不要以get或set為前綴命名。
測(cè)試:
public class FastJsonTest {
public static void main(String[] args) {
// json轉(zhuǎn)對(duì)象
String jsonStr = "{\"name\":\"張三\"}";
Student student = JSON.parseObject(jsonStr, Student.class);
System.out.println("json轉(zhuǎn)對(duì)象: "+student.toString());
// 對(duì)象轉(zhuǎn)json
Student student1 = new Student();
student1.setName("張三");
String jsonString = JSONObject.toJSONString(student1);
System.out.println("對(duì)象轉(zhuǎn)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轉(zhuǎn)對(duì)象: Student{name='張三'}
對(duì)象轉(zhuǎn)json: {"grade":100,"name":"張三"}
類中寫了個(gè)getGrade方法,被認(rèn)為是有一個(gè)Grade屬性,這樣在其它地方使用可能會(huì)有問題。
2. 布爾類型屬性名不能以is開頭
【強(qiáng)制】POJO類中的任何布爾類型的變量,都不要加is前綴,否則部分框架解析會(huì)引起序列 化錯(cuò)誤。
說明:在本文MySQL 規(guī)約中的建表約定第一條,表達(dá)是與否的值采用 is_xxx的命名方式,所以,需要在 <resultMap>設(shè)置從 is_xxx到xxx的映射關(guān)系。
反例:定義為基本數(shù)據(jù)類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),框架在反向解析的時(shí) 候,“誤以為”對(duì)應(yīng)的屬性名稱是 deleted,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常。
引自:Java開發(fā)手冊(cè)(泰山版)編程規(guī)約,命名風(fēng)格一節(jié)。
如果以 Boolean isDeleted 命名屬性,那它對(duì)應(yīng)getter方法的正確寫法應(yīng)該是isIsDeleted(),但是最好避免這樣寫。