Java boolean類型 Getter Setter 的使用和細節.md
boolean 類型在Getter Setter問題上與其他類型有不小的差別,在用lombok重構GetterSetter時暴露了一些問題。
- 系統中現有的Getter,Setter調用
- 不能從json完整的反序列化,也不能正常序列化
問題分析案例演示整理如下:
定義一個Class,包含全部場景,基本類型的帶is和不帶is,包裝類型帶is和不帶is。
private boolean busy;
private boolean isComplete;
private Boolean verify;
private Boolean isFinish;
IDE和lombok生成getter,setter的規則一樣(本例使用lombok),都是sun定義的標準。
基本類型:無論帶不帶is,都是isXxx,setXxx。特殊,需要注意。 包裝類型:和其他類型一樣,getXxx,setXxx;getIsXxx,setIsXxx 和其他類型一致。
privatestatic GetterSetterTester getterSetter(){
GetterSetterTester t = new GetterSetterTester();
//基本類型:無論帶不帶is,都是isXxx,setXxx。 sun的標準,需要特殊注意
t.isBusy();
t.setBusy(true);
t.isComplete();
t.setComplete(true);
//包裝類型:和其他類型一樣,getXxx,setXxx;(其他類型的isXxx也是 getIsXxx,setIsXxx,不算特例).
t.getVerify();
t.setVerify(true);
t.getIsFinish();
t.setIsFinish(true);
return t;
}
和json相互轉化(fastjson)
屬性名是 isXxx 就期望json字段是isXxx。可是boolean類型的isXxx屬性序列化出來是xxx。當然,isXxx的json是不能反序列化到class的boolean類型。因此,要序列化就用Boolean。 空對象時的json,基本類型默認是false,會輸出;包裝類型默認是null,不輸出。
privatestaticvoidtestJson(GetterSetterTester t){
//期望的json格式
String json = "{\"busy\":true,\"isComplete\":true,\"isFinish\":true,\"verify\":true}";
GetterSetterTester p = JSON.parseObject(json, GetterSetterTester.class);
System.out.println(p.isBusy());
System.out.println(p.isComplete()); //false
System.out.println(p.getVerify());
System.out.println(p.getIsFinish());
//實際的json格式,可成功反序列化成對象。
//基本類型變量無論是否有is,json都沒有is(與getter一致)。
System.out.println(t.toString());//{"busy":true,"complete":true,"isFinish":true,"verify":true}
//空對象時的json,基本類型默認是false,會輸出;包裝類型默認是null,不輸出。
System.out.println(new GetterSetterTester().toString());//{"busy":false,"complete":false}
}
結論
- boolean(基本類型)Getter,Setter 方法是個特例,需要注意。
- Boolean(包裝類型)Getter,Setter和其他類型一樣。
當然,遇到的問題都是我們書寫不規範導致,畢竟標準已經定義(這樣費解的標準實在是...)。因此建議:方法內部使用可以用基本類型,如 for , >> 等;除此之外,都建議使用包裝類型Boolean,如接口,持久化等。既然是面向對象,就少用基本類型。
完整測試類
package com.ndp.fb.rdb.model;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* Created by jacky.cheng on 2016/3/10.
*/
@Getter
@Setter
@NoArgsConstructor
public classGetterSetterTester{
private boolean busy;
private boolean isComplete;
private Boolean verify;
private Boolean isFinish;
@Override
public String toString(){
return JSON.toJSONString(this);
}
publicstaticvoidmain(String[] args){
GetterSetterTester t = getterSetter();
testJson(t);
}
privatestatic GetterSetterTester getterSetter(){
GetterSetterTester t = new GetterSetterTester();
//基本類型:無論帶不帶is,都是isXxx,setXxx。 sun的標準,需要特殊注意
t.isBusy();
t.setBusy(true);
t.isComplete();
t.setComplete(true);
//包裝類型:和其他類型一樣,getXxx,setXxx;(其他類型的isXxx也是 getIsXxx,setIsXxx,不算特例).
t.getVerify();
t.setVerify(true);
t.getIsFinish();
t.setIsFinish(true);
return t;
}
privatestaticvoidtestJson(GetterSetterTester t){
//期望的json格式
String json = "{\"busy\":true,\"isComplete\":true,\"isFinish\":true,\"verify\":true}";
GetterSetterTester p = JSON.parseObject(json, GetterSetterTester.class);
System.out.println(p.isBusy());
System.out.println(p.isComplete()); //false
System.out.println(p.getVerify());
System.out.println(p.getIsFinish());
//實際的json格式,可成功反序列化成對象。
//基本類型變量無論是否有is,json都沒有is(與getter一致)。
System.out.println(t.toString());//{"busy":true,"complete":true,"isFinish":true,"verify":true}
//空對象時的json,基本類型默認是false,會輸出;包裝類型默認是null,不輸出。
System.out.println(new GetterSetterTester().toString());//{"busy":false,"complete":false}
}
}
參考自:http://my.oschina.net/u/1010547/blog/634975