2012-06-30 10 views
5

Istnieje pytanie na temat przepełnienia stosu, dlaczego starting a thread inside the constructor is not a good idea. Zdałem sobie sprawę, że wynikiem takiej rzeczy będzie to, że "to" może uciec. Czytałem również, że publishing a EventListener from constructor jest również złym pomysłem z tego samego powodu. Jakie są inne wzorce, o których powinienem wiedzieć, w których "to" może uciec?Jakie są różne sposoby, w jakie "to" może uciec w Javie?

+1

Kluczowym rozróżnieniem jest to, że "ten" ucieka w stanie częściowym, zanim zostanie całkowicie skonstruowany. – phatfingers

Odpowiedz

4

Wywołanie metody instancji obiektu z konstruktora przecieka this do tej matematyki. Może to być OK, o ile ta metoda jest pod twoją kontrolą (nie można jej publicznie zastępować), a upewnisz się, że nie wyciekłeś z niej dalej niż this. Używanie argumentu dowolnej metody jest oczywiście bardziej wyraźnym wariantem, a dzieje się tak, gdy mówisz: x.addEventListener(this). Może bardziej insdidious, ponieważ mniej oczywiste, sposób przeciekać this jest, aby nie używać this się jako argument, ale wystąpienie wewnętrznej/local/klasy anonimowej, powiedzmy

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

We wszystkich tych przypadkach this będzie być obudową obiektu przekazanego jako argument metody. Jeśli, z drugiej strony, zadeklarujesz klasę zagnieżdżoną static, będzie ona miała , a nie mieć instancję otaczającą.

+0

Więc mogę założyć, że "to" może wyciec, gdy "to" zostanie przekazane jako argument do metody obcej (Do klasy "Foo" obcymi metodami są te, nad którymi nie ma kontroli i które mogą oznaczać metody innych klas lub inne niż prywatne/nadpisujące metody samego C)? – Inquisitive

+0

Widzę, że nie wyjaśniłem wystarczająco dobrze w pierwszym zdaniu. Miałem na myśli "dowolną metodę instancji obiektu" this "(ten, którego konstruktor jest wykonywany). W przypadku metod obcych, ich poziom dostępu nie ma znaczenia. Liczy się to, czy przekazujesz 'this' do takiej metody --- jawnie lub niejawnie poprzez wewnętrzną instancję klasy. –

Powiązane problemy