Java boolean类型 Getter Setter 的使用和细节.md 博客分类: fastjson fastjsonjson取不到值转换为boolean为nullLinux
程序员文章站
2024-03-24 16:54:04
...
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