為什麼阿里巴巴強制要求使用包裝型別定義屬性?

喝水會長肉發表於2021-12-15

在阿里巴巴Java開發手冊中,對於POJO中如何選擇變數的型別也有著一些規定:

這裡強制要求使用包裝型別,原因是什麼呢?

我們來看一段簡單的程式碼


/**

* @author Hollis
*/

public class BooleanMainTest {
    public static void main ( String [ ] args ) {
       Model model1 = new Model ( ) ;
       System .out . println ( "default model : " + model1 ) ;
    }
}

class Model {
    /**
    * 定一個Boolean型別的success成員變數
    */

    private Boolean success ;
    /**
    * 定一個boolean型別的failure成員變數
    */

    private boolean failure ;

    /**
    * 覆蓋toString方法,使用Java 8 的StringJoiner
    */

   @Override
    public String toString ( ) {
        return new StringJoiner ( ", " , Model .class . getSimpleName ( ) + "[" , "]" )
            . add ( "success=" + success )
            . add ( "failure=" + failure )
            . toString ( ) ;
    }
}

以上程式碼輸出結果為:

default model : Model[success=null, failure=false]

可以看到,當我們沒有設定Model物件的欄位的值的時候,Boolean型別的變數會設定預設值為 null,而boolean型別的變數會設定預設值為 false

即物件的預設值是 null,boolean基本資料型別的預設值是 false

也就是說,包裝型別的預設值都是null,而基本資料型別的預設值是一個固定值,如boolean是false,byte、short、int、long是0,float是0.0f等;

我們再舉一個扣費的例子,我們做一個扣費系統,扣費時需要從外部的定價系統中讀取一個費率的值,我們預期該介面的返回值中會包含一個浮點型的費率欄位。當我們取到這個值得時候就使用公式:金額*費率=費用 進行計算,計算結果進行劃扣。

如果由於計費系統異常,他可能會返回個預設值,如果這個欄位是Double型別的話,該預設值為null,如果該欄位是double型別的話,該預設值為0.0。

如果扣費系統對於該費率返回值沒做特殊處理的話,拿到null值進行計算會直接報錯,阻斷程式。拿到0.0可能就直接進行計算,得出介面為0後進行扣費了。這種異常情況就無法被感知。

有人說,那我可以對0.0做特殊判斷,如果是0一樣可以阻斷報錯啊。//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!但是,這時候就會產生一個問題,如果允許費率是0的場景又怎麼處理呢?

所以,使用基本資料型別只會讓方案越來越複雜,坑越來越多。

這種使用包裝型別定義變數的方式,通過異常來阻斷程式,進而可以被識別到這種線上問題。如果使用基本資料型別的話,系統可能不會報錯,進而認為無異常。

以上,就是建議在POJO和RPC的返回值中使用包裝型別的原因。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2847842/,如需轉載,請註明出處,否則將追究法律責任。

相關文章