2012-06-30 11 views
5

Neden starting a thread inside the constructor is not a good idea numaralı Yığın Taşması hakkında bir soru var. Böyle bir şeyin sonucunun 'bu' kaçabileceğini anladım. Aynı zamanda publishing a EventListener from constructor'un da aynı sebepten dolayı kötü bir fikir olduğunu okudum. 'Bu' nın kaçabileceği konusunda bilmem gereken diğer desenler neler? yapıcı adresinin nesnenin herhangi örneği yöntemin çağrılması"Bu" nın Java'da kaçabileceği çeşitli yollar nelerdir?

+1

Önemli bir ayrım, 'bu', tamamen oluşturulmasına izin verilmeden önce kısmi bir durumda kaçar. – phatfingers

cevap

4

o Mathod için this sızdırıyor. Bu yöntem sizin denetiminiz altında olduğu sürece (herkes tarafından geçersiz kılınamaz) ve bu nedenle this'dan daha fazla sızdırmadığınızdan emin olabilirsiniz. Herhangi bir yönteme argüman olarak this'u kullanmak elbette daha açık bir varyanttır ve x.addEventListener(this) derken bu durum gerçekleşir. Bir belki de daha insdidious, az belirgin beri yolu this bağımsız değişken olarak kendisini this değil kullanmaktır sızmaya ancak bir iç/yerel/anonim sınıfının bir örneği, bütün bu durumlarda

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 
    } 
} 

demek this olacak Bir yöntem argümanı olarak iletilen nesnenin ilişikteki örneği. Öte yandan, static iç içe geçmiş sınıfı bildirirseniz, 'un bir kapatma örneğine sahip olmayacaktır.

+0

Yani 'bu' bir uzaylı yöntemine bir argüman olarak geçtiğinde 'bu' sızabileceğini varsayabilirim ('Bir Sınıf' Foo'ya 'yabancı bir metot, üzerinde herhangi bir kontrole sahip olmayanlar ve diğer sınıfların yöntemleri anlamına gelebilir. veya C'nin kendisinde olmayan/geçersiz kılınabilen yöntemleri)? – Inquisitive

+0

Görüyorum ki ilk cümlede yeterince açıklamamıştım. "Bu" nesnenin "herhangi bir örnek yöntemi" kastediyorum (kurucusu çalıştırılan). Yabancı yöntemler kadarıyla, erişim seviyeleri önemli değil. Önemli olan, 'bu' yöntemini bu tür bir yönteme - ister içsel bir sınıf örneğinden açıkça ya da dolaylı olarak - aktarıyor olmanızdır. –