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
發佈了245 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章