改善Java程序建議12

建議12:避免用序列化類(lèi)在構(gòu)造函數(shù)中為不變量賦值

一般來(lái)說(shuō),final標(biāo)識(shí)的屬性是不變量,也就是說(shuō)只能賦值一次,不能重復(fù)賦值,但是在序列化類(lèi)中有些不一樣。

public class Person implemnets Serializable{
  private static final long serialVersionUID = 71282334L;
  //不變量
  public final String name = "混世魔王";
}

這個(gè)Person類(lèi)(此時(shí)V1.0版本)被序列化,然后存儲(chǔ)在磁盤(pán)上,在被反序列化時(shí)name屬性會(huì)重新計(jì)算其值,(這與static變量不同,static變量壓根就沒(méi)有保存在數(shù)據(jù)流中),比如name屬性修改成了“德天使”(版本升級(jí)為V2.0),那么反序列化對(duì)象的name值就是“德天使”。也就是說(shuō),如果final屬性是一個(gè)直接量,在反序列化時(shí)就會(huì)重新計(jì)算。

接下來(lái)看另一種賦值方法:通過(guò)構(gòu)造函數(shù)賦值。

public class Person implements Serializable {
  private static final long serialVersionUID = 91282334L;
  public final String name;
  public Person(){
    name = "混世魔王";
  }
}

然后進(jìn)行序列化,然后在修改name="德天使",接著反序列化。結(jié)果name仍然是“混世魔王”。

** 這里涉及到反序列化的另一個(gè)規(guī)則:反序列化時(shí)構(gòu)造函數(shù)不會(huì)執(zhí)行**

反序列化的過(guò)程是這樣的:JVM從數(shù)據(jù)流中獲取一個(gè)Object對(duì)象,然后根據(jù)數(shù)據(jù)流中的類(lèi)文件描述信息(在序列化時(shí),保存到磁盤(pán)的對(duì)象文件中包含了類(lèi)的描述信息,注意是類(lèi)描述信息,不是類(lèi))查看,發(fā)現(xiàn)是final變量,需要重新計(jì)算,于是引用Person類(lèi)中的name值,而此時(shí)JVM又發(fā)現(xiàn)name竟然沒(méi)有復(fù)制,不能引用,于是它不在初始化,保持原值狀態(tài),所以仍然是“混世魔王”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,596評(píng)論 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,196評(píng)論 1 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,734評(píng)論 18 399
  • title: fedora安裝virtualboxid: 22categories: linux的學(xué)習(xí)記錄date...
    jeffleefree閱讀 457評(píng)論 0 1
  • 余 異域 初相遇 有緣齊聚 今偏安一隅, 依然心絲萬(wàn)縷 獨(dú)坐無(wú)言也自語(yǔ) 庸人自擾亂思緒 不如細(xì)聽(tīng)一曲 宮商角徵羽 ...
    晨雨曦閱讀 187評(píng)論 0 0

友情鏈接更多精彩內(nèi)容