前言
我沒有閃
正文
最近在做項目,在對象判空的時候,根據業務需求,寫了個自動判空的方法 isEmpty()。
代碼示例:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @Author: JCccc
* @Description:
* @Date: 2020/11/23 10:13
*/
@Data
@Accessors(chain = true)
public class Programmer {
private Integer id;
private String name;
private Integer age;
private String jobNum;
private String imgUrl;
private String cardId;
private String phone;
public boolean isEmpty() {
return null == this.jobNum;
}
}
這一切都看似正常,但是在寫完業務邏輯後,自測地時候發現傳回json格式資料時,多了個字段 empty。
直覺告訴我,這個empty肯定跟我自己寫的判空方法有關。但是一下子還不知道為啥。

問題複現,就是轉成JSON資料傳回時,發現一個key 為 empty ,值為false :
代碼示例:
public static void main(String[] args) {
Programmer programmer=new Programmer();
programmer.setId(1);
programmer.setName("JCccc");
programmer.setAge(12);
programmer.setJobNum("10010");
programmer.setImgUrl(null);
programmer.setCardId("xxxxxxxxxxxxx");
programmer.setPhone("136xxxxxxxx");
JSONObject jsonObject= (JSONObject) JSON.toJSON(programmer);
System.out.println(jsonObject.toJSONString());
}
輸出結果:
這個 empty 怎麼出現的呢 ?
一下子有點蒙圈,但是咱們也是武林中人,走一波正常排查流程。
1.根據直覺,肯定跟這個方法有關。
于是乎,我索性把方法注釋掉,測試,發現empty字段消失了。
問題鎖定,就是這個方法。
2.那麼根據方法的編譯時規則,辨識方法的身份特征,是 方法名 和 參數。
而我寫的判空方法,是沒有傳遞參數的,是以,進一步确定, 方法名問題。
于是乎我把方法名随便改了個名字,testA(),果然一測試,發現empty字段消失了。
這一下子,思路清晰了,好像想到了一些東西,沒錯,就是阿裡巴巴的開發手冊好像有這麼一個注意項,如圖:
沒錯,正是因為這個is開頭的命名導緻的!!!
通過debug也是可以看到的,有興趣的可以debug直接看這個方法:
第一個debug點:
第二個debug點:
第三個debug點:
第四個debug點:(其實到了這裡,針對方法的話,fastJson還是給了機會的,隻需要使用@JSONField(serialize=false) 注解就好了)
好吧,就先這樣吧。
我已經改成verifyEmpty()了,畢竟都是前人踩坑總結出來的,就注意好了。
(本人已測試,不止fastjson,還有其他序列化如果使用is開頭的變量,也會有影響。 )