2012-08-12 59 views
1

我在閱讀本書Java Concurrency in Practice
第4.2章 - 實例約束它說約束對象也可以通過發佈可以間接發佈約束對象的迭代器或內部類實例等其他類來轉義。
有人可以給每個例子(代碼)嗎?Java:由迭代器和內部類轉義的對象

回答

3

當然,這裏有兩個例子。
迭代器:

public class NonSafe { 
    private List x; 

    public Iterator getIterator() { 
     return x.iterator(); 
    } 
} 

即使x是私有的,你仍然可以進行操作,如delete(),其Iterator,修改x

內部類:

public class Outer { 
    private Object x; 

    class Inner { 
     public Object lookAtOuter() { 
      return Outer.this.x; 
     } 
    } 
} 

這裏,躲過參考Inner,造成的間接引用x外溢,即使是私人的。

+0

我想知道會不會在這種情況下解決問題的防禦副本? – peter 2012-08-12 19:49:05

+0

@ user1389813:一個副本通常會這樣做。但要小心,僅僅製作一個像List這樣的集合的副本是不夠的,你將不得不執行深層複製(複製這些元素)以使所有事情都絕對安全。 – Keppil 2012-08-12 19:51:46

+0

非常感謝你 – peter 2012-08-12 19:55:59