Java boolean类型 Getter Setter 的使用和细节.md

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

猜你喜欢

转载自lihaiming.iteye.com/blog/2294021
今日推荐