2012-06-30 51 views
5

關於爲什麼starting a thread inside the constructor is not a good idea堆棧溢出存在一個問題。我意識到這樣的事情的結果將是'這'可以逃脫。我也讀了publishing a EventListener from constructor也是一個壞主意,出於同樣的原因。我應該知道哪些「這個」可以逃脫的其他模式?「this」在Java中可以轉義的各種方式有哪些?

+1

一個關鍵的區別是'this'在允許被完全構建之前在部分狀態下轉義。 – phatfingers

回答

4

從構造函數調用您的對象的任何實例方法泄漏this到該方法。只要該方法在您的控制範圍內(不能公開覆蓋),您可以確定不會再漏出this。使用this作爲任何方法的參數當然是更明確的變體,當你說x.addEventListener(this)時會發生這種變化。一個或許更insdidious,因爲不太明顯,這樣滲漏,this是不使用this本身作爲參數,但內/地方/匿名類的一個實例,說

public class Main 
{ 
    private class MyListener extends MouseAdapter { ...} 

    public Main() { 
    class Listener1 extends MouseAdapter { ... } 
    someSwingComponent.addMouseListener(new MyListener()); // inner class 
    someSwingComponent.addMouseListener(new Listener1()); // local class 
    someSwingComponent.addFocusListener(new FocusAdapter() { ... }); // anonymous 
    } 
} 

在所有這些情況this會是作爲方法參數傳遞的對象的封閉實例。另一方面,如果你聲明一個static嵌套類,它將會有而不是有一個封閉的實例。

+0

所以我可以假設'this'可以在'this'作爲外部方法的參數傳遞時泄漏(對於'Foo'類來說,外來方法是無法控制的方法,它可能意味着其他類的方法或C本身的非私有/可重寫方法)? – Inquisitive

+0

我發現我在第一句話裏沒有把我的觀點弄清楚。我的意思是「這個」對象「的任何實例方法(構造函數正在執行的那個方法)。就外來方法而言,他們的訪問級別無關緊要。重要的是,你是否將'this'傳遞給這樣一個方法 - 通過內部類實例顯式或隱式地傳遞。 –

相關問題