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?
Odpowiedz
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ą.
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
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. –
Kluczowym rozróżnieniem jest to, że "ten" ucieka w stanie częściowym, zanim zostanie całkowicie skonstruowany. – phatfingers