第三章 對象的共享-3.2發(fā)布與逸出

“發(fā)布(Publish)”一個對象的意思是指,使對象能夠在當前作用域之外的代碼中使用
當某個不應該發(fā)布的對象被發(fā)布時,這種情況稱之為“逸出(Escape)”

發(fā)布就是把對象的引用傳到在當前作用域之外,發(fā)布是基于JAVA的引用傳遞機制,所以這里指的是對象,不包括基本類型,發(fā)布本身是一種技術或者機制,并無好壞之分。不“希望”發(fā)布的對象卻被發(fā)布了,那么就說這個對象逸出了。所以說這種現(xiàn)象是根據(jù)實際情況決定的,如果一個對象你“希望”他發(fā)布且發(fā)布了,那么就是正常發(fā)布,如果一個對象你不“希望”被發(fā)布卻發(fā)布了,那么就是逸出。針對逸出情況,可能會對程序運行造成影響,特別是多線程處理,也有可能并不影響程序運行。

下面我們看下幾種發(fā)布對象的方式

  • 將一個指向該對象的引用保存到其他代碼可以訪問的地方--方法體內的對象引用保存到類的公有靜態(tài)變量

例子中發(fā)布的對象為set,如果set添加元素,則這些元素也被發(fā)布。在這里發(fā)布的意思就是在當前作用域中(intitialize方法體中)set對象的引用保存在knownSecret中,這樣就可以在當前作用域外通過knownSecret引用操縱set對象,包括set中的元素。

  • 將一個指向該對象的引用保存到其他代碼可以訪問的地方--類的私有對象的引用通過公有方法返回

例子中states對象本來只作用于類內,但是現(xiàn)在其他對象可以通過getStates方法得到states的引用并修改狀態(tài)。

  • 將一個指向該對象的引用保存到其他代碼可以訪問的地方--類對象傳遞給外部方法
對象類型
引用該對象的類
修改Study類中person對象的類(方法)

例子中描述的Study類的studyself方法中,因調用了Enjoy類的watchTV方法導致自身person數(shù)據(jù)狀態(tài)發(fā)生改變。

以上三種方式都是把對象的引用發(fā)布到外部,導致外部在持有對象引用時可以修改數(shù)據(jù)狀態(tài)。

以下兩種發(fā)布方式發(fā)布的對象為this。

  • 內部類的方式

person是Outer的內部屬性,但是其他類可以通過內部類Inner去訪問修改。只要是Outer的屬性,即可通過this訪問的屬性都發(fā)布出去了。

  • 構造時發(fā)布this引用

輸出結果:
構造前:Person [age=0, name=buff]
構造后:Person [age=10, name=oba]
線程修改后::Person [age=10, name=oba]

這種情況主要是在對象還沒有構造完成就對其引用,并修改了數(shù)據(jù)狀態(tài)。

使用封裝的主要原因:封裝能夠使得對程序的正確性進行分析變得可能,并使得無意中破壞設計約束條件變得更難。

閱讀自此,有種豁然開朗的感覺,才知道在設計類時對于權限修飾符的選擇是以此為出發(fā)點的的。以上的發(fā)布情況,都可以通過權限修飾符進行合理的處理,但這樣的話就無法進行正常的發(fā)布,無法實現(xiàn)線程間的數(shù)據(jù)共享。所以本書后面的章節(jié)會提出解決方式。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容