以前只是 知其然不知所以然,搞學問搞工作這樣肯定是不行的,今天就來扯一下為什么用包裝類。
--------------------------------------------------------------------------------------------------------------------------------
基礎知識點: byte,short,int,long 的初始化默認值為 0 float,double 的初始化默認值為 0.0 char 初始化默認值為 " ",空白格,控制台會打印一個特殊符號顯示空白格 boolean 初始化默認值是 false
基礎知識點: 包裝類 的初始默認值為 null
為什么實體類用包裝類不用基本數據類型呢,舉個例子,實體類用 Integer 不用 int :
- 因為int如果設為空的話默認為0而Integer為Null,Null對於程序來說比較好控制,可以做空值判斷以及對數據做統一處理 - Integer 允許為null值,int默認0,數據庫里面如果有個字段沒有值可能默認值為null,用Integer比較合適。 - int的默認值為0,而Integer默認值為null。 數據庫中數據存在為空的情況。 返回數據庫字段值是 null 的話,int類型會報錯。 int是基本數據類型,其聲明的是變量,而null則是對象。 所以用integer。
為了避開基本數據類型的坑,阿里巴巴約定實體類不使用基本數據類型!統一使用包裝類!
如上是阿里巴巴的開發手冊對實體類的要求!必須用包裝類型!
接下來看實例:
--------------------------------------------------------------------------------------------------------------------------------
再補充一下:序列化!
為什么實體類要 implements Serializable 接口 private static final long serialVersionUID = 1L;
為什么要序列化 ?
首先你不序列化就會報錯!
序列化:就是把JavaBean對象轉成JSON格式的字符串。
反序列化:就是把JSON格式的字符串轉化為JavaBean對象。
實現序列化需要和程序打招呼,這個招呼就是一個標記,就是一個空的接口 Serializable 。所以實體類需要 實現 序列化接口,就是和 Java打招呼,給我序列化!
serialVersionUID 序列化ID的作用是:控制程序的版本
什么是版本控制,是不是有點蒙 ?
當我讓 serialVersionUID 自動生成的時候,我把我的實體類序列化,得到下面的內容(假設生成的ID是 key1)
{ "name": "yangguo", "age": 20 }
然后,我反序列化得到楊過這個對象(ID是 key1)
name = "yangguo";
age = 20;
然后過了一年,楊過有了孩子,我增加了楊過這個實體類的字段
name="yangguo"; age=21; son="yangkang";
然后我去序列化 (ID變成了 key2)
{ "name": "yangguo", "age": 20, "son": "yangkang" }
反序列化 (ID是 key1)
這個時候就會報錯,反序列化失敗。
設置 private static final long serialVersionUID = 1L; 的好處就出來了,保持 serialVersionUID 的值為1不變,后面如果修改了實體類,依然可以反序列化成功!
----------------------------------------------
以上是個人理解,有不對的地方請加以批評指正,萬分感謝!