以前只是 知其然不知所以然,搞学问搞工作这样肯定是不行的,今天就来扯一下为什么用包装类。
--------------------------------------------------------------------------------------------------------------------------------
基础知识点: 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不变,后面如果修改了实体类,依然可以反序列化成功!
----------------------------------------------
以上是个人理解,有不对的地方请加以批评指正,万分感谢!