關於爲什麼starting a thread inside the constructor is not a good idea堆棧溢出存在一個問題。我意識到這樣的事情的結果將是'這'可以逃脫。我也讀了publishing a EventListener from constructor也是一個壞主意,出於同樣的原因。我應該知道哪些「這個」可以逃脫的其他模式?「this」在Java中可以轉義的各種方式有哪些?
回答
從構造函數調用您的對象的任何實例方法泄漏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
嵌套類,它將會有而不是有一個封閉的實例。
所以我可以假設'this'可以在'this'作爲外部方法的參數傳遞時泄漏(對於'Foo'類來說,外來方法是無法控制的方法,它可能意味着其他類的方法或C本身的非私有/可重寫方法)? – Inquisitive
我發現我在第一句話裏沒有把我的觀點弄清楚。我的意思是「這個」對象「的任何實例方法(構造函數正在執行的那個方法)。就外來方法而言,他們的訪問級別無關緊要。重要的是,你是否將'this'傳遞給這樣一個方法 - 通過內部類實例顯式或隱式地傳遞。 –
- 1. 構建響應式網站的各種方法有哪些?
- 2. 各種DispatcherServlet.detectAllXxx標誌有哪些用例?
- 3. 哪種方式可以最有效地控制旋轉?
- 4. Java:小應用程序的各種可用安全設置有哪些
- 5. 我在哪裏可以找到有關某些方面的各種現有本體?
- 6. 哪種方法可以代替被重複轉義的字符?
- 7. 在java中哪種方式更好?
- 8. Java加密擴展中的各種AES變體有哪些優缺點?
- 9. 哪些GLSL ES擴展在各種iOS設備上可用?
- 10. 以各種各樣的方式綁定成員函數
- 11. 在Python中以這種方式創建類和實例有哪些優缺點?
- 12. 在各種緩存中有意義
- 13. 定義腳本的各種方式有什麼不同?
- 14. 哪種方法可以爲Objective-C中的類定義私有方法?
- 15. 以有效的方式保存各種對象的ArrayList
- 16. 子類可以在Java中繼承哪些方法?
- 17. 有什麼方法可以在Python上格式化各種貨幣?
- 18. DNX可以找到軟件包的方式有哪些?
- 19. 一種有趣的方式在Java中
- 20. 附加屬性的各種用途有哪些?
- 21. 性格中的各種方式
- 22. 在Unix環境中,有沒有一種方法可以以編程方式調用C中的哪個?
- 23. 我可以通過哪些方式來改善這種正則表達式?
- 24. 我在哪裏可以找到各種各樣的「而你等待」旋轉的齒輪齒形GIF圖像
- 25. 哪種方式去與這些錯誤
- 26. 在哪種方式我可以使用在Windows
- 27. 各種Python實現有哪些優缺點?
- 28. 從哪裏可以獲得各種PDF版本的樣本?
- 29. 以各種方式替換字符串中的字符
- 30. 如何以編程方式訪問Nib中的各種UIViews?
一個關鍵的區別是'this'在允許被完全構建之前在部分狀態下轉義。 – phatfingers