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. –
- 1. Jakie są różne sposoby zastąpienia kursora?
- 2. Jakie są różne techniki zapamiętywania w Javie?
- 3. Jakie są różne sposoby obsługi wyliczeń na serwerze SQL?
- 4. Jakie są różne rodzaje runfiles
- 5. Jakie są różne rodzaje spraw?
- 6. Jakie są teraz zaawansowane sposoby obsługi skryptów w języku Java?
- 7. Jakie są alternatywne sposoby wyszukiwania next(). Next() w jquery
- 8. Jakie są najbardziej idiomatyczne sposoby łączenia tensorów w pochodni?
- 9. Jakie są alternatywne sposoby modelowania relacji M: M w Cassandrze?
- 10. Jakie są sposoby decydowania o prawdopodobieństwach w ukrytych modelach Markowa?
- 11. Jakie są sposoby unikania mutacji obiektu w Dart-lang?
- 12. Jakie są różne sposoby radzenia sobie z błędami w szablonie FreeMarker?
- 13. Potrzebuję uczyć się usług sieciowych w Javie. Jakie są w nim różne typy?
- 14. Jakie są wszystkie sposoby przechodzenia między drzewami katalogów?
- 15. Jakie są/są sposoby (i) Scala implementacji tego Java "byte [] to Hex" class
- 16. Jakie są sekundy w regionie?
- 17. Jakie są odpowiednie i nieodpowiednie zastosowania refleksji w Javie?
- 18. Jakie są skuteczne sposoby debugowania zoptymalizowanego programu C/C++?
- 19. Jakie operacje w Javie są uważane za atomowe?
- 20. Jakie są strategie scalania git?
- 21. Jakie są zalety coroutines?
- 22. Jakie są różne przypadki użycia joblib a pickle?
- 23. Jakie są zalety NSBinaryStoreType?
- 24. Jakie są rzeczywiste zalety wzoru gościa? Jakie są alternatywy?
- 25. Jakie są domyślne repozytoria?
- 26. Jakie są zalety JRebel?
- 27. Jakie są zalety VistaDB
- 28. Jakie są generacje w zbieraniu śmieci?
- 29. Jakie są poziomy DOM?
- 30. Różne sposoby wdrożenia DAG w java
Kluczowym rozróżnieniem jest to, że "ten" ucieka w stanie częściowym, zanim zostanie całkowicie skonstruowany. – phatfingers