欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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