打字猴:1.700439138e+09
1700439138 编写高质量代码:改善Java程序的151个建议 [:1700438079]
1700439139 编写高质量代码:改善Java程序的151个建议 建议12:避免用序列化类在构造函数中为不变量赋值
1700439140
1700439141 我们知道带有final标识的属性是不变量,也就是说只能赋值一次,不能重复赋值,但是在序列化类中就有点复杂了,比如有这样一个类:
1700439142
1700439143 public class Person implements Serializable{
1700439144
1700439145 private static final long serialVersionUID=71282334L;
1700439146
1700439147 //不变量
1700439148
1700439149 public fnal String name=“混世魔王”;
1700439150
1700439151 }
1700439152
1700439153 这个Person类(此时V1.0版本)被序列化,然后存储在磁盘上,在反序列化时name属性会重新计算其值(这与static变量不同,static变量压根就没有保存到数据流中),比如name属性修改成了“德天使”(版本升级为V2.0),那么反序列化对象的name值就是“德天使”。保持新旧对象的final变量相同,有利于代码业务逻辑统一,这是序列化的基本规则之一,也就是说,如果final属性是一个直接量,在反序列化时就会重新计算。对这基本规则不多说,我们要说的是final变量另外一种赋值方式:通过构造函数赋值。代码如下:
1700439154
1700439155 public class Person implements Serializable{
1700439156
1700439157 private static final long serialVersionUID=91282334L;
1700439158
1700439159 //不变量初始不赋值
1700439160
1700439161 public final String name;
1700439162
1700439163 //构造函数为不变量赋值
1700439164
1700439165 public Person(){
1700439166
1700439167 name=“混世魔王”;
1700439168
1700439169 }
1700439170
1700439171 }
1700439172
1700439173 这也是我们常用的一种赋值方式,可以把这个Person类定义为版本V1.0,然后进行序列化,看看有什么问题没有,序列化的代码如下所示:
1700439174
1700439175 public class Serialize{
1700439176
1700439177 public static void main(String[]args){
1700439178
1700439179 //序列化以持久保存
1700439180
1700439181 SerializationUtils.writeObject(new Person());
1700439182
1700439183 }
1700439184
1700439185 }
1700439186
1700439187 Person的实例对象保存到了磁盘上,它是一个贫血对象(承载业务属性定义,但不包含其行为定义),我们做一个简单的模拟,修改一下name值代表变更,要注意的是serialVersionUID保持不变,修改后的代码如下:
[ 上一页 ]  [ :1.700439138e+09 ]  [ 下一页 ]