標(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ù)語可能會有一些問題充择,歡迎大家指正德玫。
設(shè)計實例變量是可變的引用類型的不可變類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄嚣,“玉大人晒屎,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵臀突,是天一觀的道長。 經(jīng)常有香客問我骇吭,道長,這世上最難降的妖魔是什么歧寺? 我笑而不...
- 正文 為了忘掉前任燥狰,我火速辦了婚禮,結(jié)果婚禮上斜筐,老公的妹妹穿的比我還像新娘龙致。我一直安慰自己,他們只是感情好顷链,可當(dāng)我...
- 文/花漫 我一把揭開白布净当。 她就那樣靜靜地躺著,像睡著了一般蕴潦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俘闯,一...
- 文/蒼蘭香墨 我猛地睜開眼湖笨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹦骑?” 一聲冷哼從身側(cè)響起慈省,我...
- 正文 年R本政府宣布荷腊,位于F島的核電站艳悔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏女仰。R本人自食惡果不足惜猜年,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疾忍。 院中可真熱鬧乔外,春花似錦、人聲如沸一罩。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽聂渊。三九已至差购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汉嗽,已是汗流浹背欲逃。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!陈惰! 因為Scala是基于Java虛擬機(jī)畦徘,也就是...
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)奴潘,斷路器旧烧,智...
- 閱了千年,吟了百遍碉纳!不變的是西游勿负,變的是看書人的心。 戰(zhàn)火狼煙的大年初一劳曹,群雄逐鹿的春節(jié)檔奴愉,雖然只是點映,但是早已...
- 當(dāng)我在《誰動了我的奶酪》這本書上看到這句話的時候檀头,我的心里挺滿意的,我已經(jīng)克服了內(nèi)心的恐懼岖沛,在自己喜歡的道路上往前...