為什麼阿里巴巴強制要求使用包裝型別定義屬性?
在阿里巴巴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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼阿里巴巴開發手冊中強制要求 POJO 類使用包裝型別?NPE問題防範阿里POJO型別
- 為什麼阿里巴巴禁止把SimpleDateFormat定義為static型別的?阿里ORM型別
- 定義物料型別的屬性型別
- js中為什麼值型別可以使用方法和屬性JS型別
- js中為什麼基本型別資料可以使用屬性和方法JS型別
- Mysql varchar型別欄位為什麼經常定義為255MySql型別
- 為什麼阿里巴巴不建議MySQL使用Text型別?阿里MySql型別
- ipa檔案證書監測有什麼用?測試安裝包有什麼用?什麼型別包需要要求資質?型別
- 在 WebSphere Process Server 中為新的查詢要求設定自定義屬性WebServer
- Java中基本資料型別和包裝型別有什麼區別?Java資料型別
- 為什麼 JavaScript 的私有屬性使用 # 符號JavaScript符號
- 阿里巴巴為什麼這樣強制從List中刪除元素阿里
- 為什麼阿里巴巴Java開發手冊中強制要求介面返回值不允許使用列舉?阿里Java
- 為什麼值型別不允許顯式定義無參建構函式型別函式
- 為什麼抓包檔案有好幾種型別?型別
- 強制修改CSS的屬性styleCSS
- 強制型別轉換型別
- SAP MM 定義物料型別的屬性配置裡的New entries按鈕型別
- 為什麼Javascript需要型別?JavaScript型別
- Python類屬性和例項屬性分別是什麼?Python
- excel屬於什麼型別的軟體Excel型別
- PHP 型別轉換&&型別強制轉換PHP型別
- 我為什麼不推薦使用BeanUtils屬性轉換工具Bean
- javascript為什麼字串直接量可以使用屬性和方法JavaScript字串
- 強制型別轉換之(==)型別
- 為什麼Vue.mixin中的定義的data全域性可用Vue
- 【譯】為什麼命名“它”為依賴屬性(DependencyProperty)
- php 使用Callable Closure強制指定回撥型別PHP型別
- javascript基本型別 引用型別 基本包裝型別JavaScript型別
- DTD文件型別定義型別
- react中什麼使用定義變數,需要使用useRef,什麼時候直接定義即可?React變數
- 為什麼React元素有一個$$typeof屬性?React
- C++強制型別轉換C++型別
- 造型與強制型別轉換型別
- android中自定義屬性重複定義Android
- Rust 通過屬性設定 crate 名稱、版本和型別Rust型別
- Rust 透過屬性設定 crate 名稱、版本和型別Rust型別
- js 物件使用點和中括號存取屬性區別是什麼JS物件