設(shè)計實例變量是可變的引用類型的不可變類

標(biāo)題可能有點繞多矮。。哈打。塔逃。
正常當(dāng)我們設(shè)計一個不可變類時,需要保證實例變量是不可變的料仗,如果當(dāng)個這個類的實例變量是一個引用類型時湾盗,而這個引用類型又是可變的該怎么設(shè)計這個不可變類?
class Name
{
private String firstName;
private String lastName;
public Name(){};
public Name(String firstName, String lastName)
{
this.firstName= firstName;
this.lastName= lastName;
}
public void setFirstName(String firstName)
{
this.firstName= firstName;
}
public String getFirstName()
{
return firstName;
}
public String getLastName()
{
return lastName;
}
}
public class Person
{
private Name name ;
public Person(Name name)
{
this.name = name;
}
public Name getName()
{
return name;
}
public static void main(String[] args)
{
Name n = new Name("渠梁" , "嬴");
Person p = new Person(n);
System.out.println(p.getName().getFirstName()); //打印渠梁
n.setFirstName("鞅");
System.out.println(p.getName().getFirstName()); //打印鞅
}
}
從上面代碼我們可以看到由于引用類型變量name中的firstName被重新設(shè)置立轧,導(dǎo)致Person的實例變量name被改變了格粪,這違背了我們開始想創(chuàng)建不可變類的初衷,想讓Person中的name實例中的數(shù)據(jù)是不可變的氛改,我們可以對Person的構(gòu)造器做如下修改帐萎;
class Name
{
private String firstName;
private String lastName;
public Name(){};
public Name(String firstName, String lastName)
{
this.firstName= firstName;
this.lastName= lastName;
}
public void setFirstName(String firstName)
{
this.firstName= firstName;
}
public String getFirstName()
{
return firstName;
}
public String getLastName()
{
return lastName;
}
}
public class Person
{
private Name name ;
public Person(Name name)
{
this.name = new Name(name.getFirstName() , name.getLastName()); //設(shè)置臨時實例;
}
public Name getName()
{
return new Name(name.getFirstName() , name.getLastName()); //設(shè)置臨時實例胜卤;
}
public static void main(String[] args)
{
Name n = new Name("渠梁" , "嬴");
Person p = new Person(n);
System.out.println(p.getName().getFirstName()); //打印渠梁
n.setFirstName("鞅");
System.out.println(p.getName().getFirstName()); //打印渠梁
}
}
原理就是在Person初始化時疆导,設(shè)置一個臨時的實例,實例中只是初始化時用了n中的屬性葛躏,但沒有把n本身return澈段,所以當(dāng)n變量中的屬性在初始化后又被改變的時候也不會導(dǎo)致臨時實例中的數(shù)據(jù)發(fā)生變化;
學(xué)Java的時候?qū)W到這里舰攒,反復(fù)看了幾遍才懂败富,感覺過段時間搞不好我會遺忘,所以這里用自己的話記錄敲一遍摩窃,加深記憶兽叮,方便以后復(fù)習(xí)。白板敲的代碼、文字中的一些術(shù)語可能會有一些問題充择,歡迎大家指正德玫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市椎麦,隨后出現(xiàn)的幾起案子宰僧,更是在濱河造成了極大的恐慌,老刑警劉巖观挎,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琴儿,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘁捷,警方通過查閱死者的電腦和手機(jī)造成,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄嚣,“玉大人晒屎,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵臀突,是天一觀的道長。 經(jīng)常有香客問我骇吭,道長,這世上最難降的妖魔是什么歧寺? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任燥狰,我火速辦了婚禮,結(jié)果婚禮上斜筐,老公的妹妹穿的比我還像新娘龙致。我一直安慰自己,他們只是感情好顷链,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布净当。 她就那樣靜靜地躺著,像睡著了一般蕴潦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俘闯,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天潭苞,我揣著相機(jī)與錄音,去河邊找鬼真朗。 笑死此疹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝗碎,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼湖笨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹦骑?” 一聲冷哼從身側(cè)響起慈省,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眠菇,沒想到半個月后边败,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡捎废,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年笑窜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登疗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡排截,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辐益,到底是詐尸還是另有隱情断傲,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布荷腊,位于F島的核電站艳悔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏女仰。R本人自食惡果不足惜猜年,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疾忍。 院中可真熱鬧乔外,春花似錦、人聲如沸一罩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聂渊。三九已至差购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汉嗽,已是汗流浹背欲逃。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留饼暑,地道東北人稳析。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓洗做,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彰居。 傳聞我的和親對象是個殘疾皇子诚纸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!陈惰! 因為Scala是基于Java虛擬機(jī)畦徘,也就是...
    燈火gg閱讀 3,452評論 1 24
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)奴潘,斷路器旧烧,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法画髓,內(nèi)部類的語法掘剪,繼承相關(guān)的語法,異常的語法奈虾,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 閱了千年,吟了百遍碉纳!不變的是西游勿负,變的是看書人的心。 戰(zhàn)火狼煙的大年初一劳曹,群雄逐鹿的春節(jié)檔奴愉,雖然只是點映,但是早已...
    我會煮泡面閱讀 601評論 0 2
  • 當(dāng)我在《誰動了我的奶酪》這本書上看到這句話的時候檀头,我的心里挺滿意的,我已經(jīng)克服了內(nèi)心的恐懼岖沛,在自己喜歡的道路上往前...
    利萍閱讀 242評論 0 0