不可變類的意思是,對該類物件例項化後,其物件屬性在整個生命週期內不再改變。
建立乙個不可變類時,需要遵循以下四條規則
不要提供任何修改物件狀態的方法
確保類中的所有方法不被過載
確保類中的成員物件為private
如果類中存在成員不是基本資料型別或不可變類時,賦值過程中避免直接使用其引用或將物件的引用暴露給外部(自己碼的描述,可能不是特別精確嚴謹。望理解,如有更好的描述還望大神多多指點)
這是乙個錯誤的例子:違背了上述規則中的第四條
原因:其成員陣列變數 i 賦值過程中,直接將引數傳遞的引用值賦給成員變數 i
final
class
kiil
public
void
addfor()
}}
上述**所建立的類滿足了前面所提到的前三點規則,但是未滿足第四點。因為通過這樣的方式直接將引數傳遞的引用值賦予成員變數。無法保證這個類是乙個不可變類。
因為我們從外部改變其引數傳遞的引用中值的內容,間接的就改變了成員變數 i 的值,無法得到類的不可變,破壞了其封裝性。
正確的寫法:
final
class
kiil
public
void
addfor()
}}
將建構函式中this.i=i
修改為this.i=i.clone();
,從而使得其類成員變數的引用是非外部可改變。 關於面試的幾個小問題
回答樣本 如果是工作需要我會義不容辭加班,我現在單身,沒有任何家庭負擔,可以全身心的投入工作。但同時,我也會提高工作效率,減少不必要的加班。回答樣本一 我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。回答樣本二 我受過系統的軟...
關於js中的幾個小問題。
問題1 使用連續賦值後面的變數會成為全域性物件的乙個屬性,並且這個屬性可以通過delete刪除。原因 賦值語句是從右往左執行的,我們將10賦值給了c,但是c此時還宣告,接著把c的返回值賦值給了b,但是b也還沒有宣告,最後賦值給了a此時a有宣告,所以a就是區域性變數。var a b c 10 cons...
關於類的大小問題
一直以來在各個論壇上都不時的見過一些關於類大小的討論,尤其是當涉及到虛繼承時,類的大小就變得更加撲朔迷離,每看完乙個帖子都覺得自己有所收穫,但當下次遇到類似的帖子時卻怎麼也想不起自己以前對此問題的記憶了,於是乎,乾脆勤快些一勞永逸地把他們記錄下來。純屬個人理解,難免有錯,我會定期更新這篇文章,修改其...