“發(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類的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é)會提出解決方式。