Dlaczego IDE narzeka na "przeciekanie tego w konstruktorze"? Zawsze zakładałem, że to po prostu zła praktyka. Ale tak naprawdę nigdy nie odkryłem, dlaczego jest źle.Wyciek Java to w konstruktorze
Odpowiedz
Wyciek odniesienia w konstruktora (nie Controller) this
jest niebezpieczne, zwłaszcza w środowisku wielowątkowym. Dzieje się tak dlatego, że obiekt nie jest w pełni skonstruowany, dopóki nie zakończy się wywołanie konstruktora. Wycieknięcie z konstruktora this
oznacza, że świat zewnętrzny uzyskuje dostęp do obiektu, który nie jest jeszcze w pełni skonstruowany. To niekoniecznie prowadzi do problemów w programie jednowątkowym (choć jest to możliwe, ale problem jest w tym przypadku bardziej oczywisty). Ale jeśli this
wycieknie do innych wątków, mogą faktycznie spróbować zrobić coś z obiektem przed jego ukończeniem, co prowadzi do subtelnych i trudnych do znalezienia błędów.
Czy ktoś mógłby proszę utworzyć i dołączyć do tego posta "najlepszą praktykę"? – user1050755
Jaki byłby przykład problemu z wyciekiem "tego" w programie z jednym gwintem? – WaelJ
W życiu jest kilka absolutów, np. musisz płacić podatki ... lub ... śmierć jest nieunikniona. Ale "przekazanie this
z konstruktora jest zawsze złe" - nie jest jednym z nich.
Ograniczenia wskazane przez Petera są trafne i ważne. Z pewnością problematyczne byłoby przecięcie this
z konstruktora w dowolną metodę lub kontekst, w którym odniesienie zostanie opublikowane dla nieznanych lub niezaufanych klientów. Niedobrze jest opublikować referencję dla jeszcze nie w pełni skonstruowanego obiektu na dowolny kod klienta, zaufany lub nie, który działa przy założeniu, że będzie miał widok na poprawny i spójny obiekt.
Powiedział, że nie ma absolutnie nic złego w przejściu this
od konstruktora sposobu opakowania-prywatnego, który wykonuje wspólne inicjowanie na, powiedzmy, grupy obiektów, które mają wspólny interfejs, szczególnie jeśli inicjalizacja jest długa lub złożony.
TL; DR: Z pewnością istnieją sytuacje, w których, moim zdaniem, nie jest dopuszczalne zaakceptowanie tylko this
od konstruktora, ale jest to naprawdę pożądane.
Po prostu tego nie rób. Po prostu marnowaliśmy dni na pracę nad błędem stworzonym wiele lat temu, kiedy ktoś przekazał "to" z konstruktora do "zaufanej" metody "prywatnej paczki". Z biegiem czasu metoda ta narastała, a niezainicjowana instancja dostała się do kolejki zdarzeń. Po prostu użyj ostatecznego init() po zbudowaniu i zostań anonimowym bohaterem. – Charlweed
- 1. Dlaczego to jest wyciek pamięci
- 2. Java Inicjalizacja kalendarza w konstruktorze
- 3. Jak to wyciek ten kanał?
- 4. Wyłapywanie wyjątków w konstruktorze
- 5. Java 8 Dostawca z argumentami w konstruktorze
- 6. Czy jest to wyciek kontekstu systemu Android?
- 7. Czy to PyList_Append (lista, Py_BuildValue (...)) wyciek?
- 8. Java webapp wyciek pamięci podczas korzystania ScheduledExecutorService
- 9. W jaki sposób "to" działa w funkcjach przypisanych w konstruktorze?
- 10. Czy spowoduje to wyciek pamięci w szybkiej metodzie klasy
- 11. Co to jest parametr nawias klamrowy w konstruktorze C++ 11
- 12. Jak znaleźć wyciek pamięci w Java za pomocą JProfiler?
- 13. Wyciek pamięci w javacv
- 14. wyciek pamięci w GMSMapView
- 15. instancji obiektów w konstruktorze
- 16. Wyjątek w konstruktorze statycznym
- 17. Catching wyjątek w konstruktorze
- 18. Scala zmienne końcowe w konstruktorze
- 19. super() w konstruktorze
- 20. JAXBContext.newInstance wyciek pamięci
- 21. Czy jest to wyciek zasobów, czy fałszywy alarm?
- 22. Jak stworzyć wyciek pamięci w C#/.NET
- 23. Wyciek pamięci w MapKit iOS8
- 24. Initialize Boost shared_ptr w konstruktorze
- 25. Dodawanie odbiorców zdarzeń w konstruktorze
- 26. Używanie "this" w konstruktorze podstawowym?
- 27. wskaźnik funkcji członka w konstruktorze
- 28. Dlaczego wywołanie super() w konstruktorze?
- 29. Tajemniczy przepełnienie stosu w konstruktorze
- 30. Przekazywanie varargs w konstruktorze podrzędnym
Spójrz na http://stackoverflow.com/questions/3921616/java-leaking-this-in-constructor –
FWIW, w rzeczywistości istnieje teoretyczna luka bezpieczeństwa JVM, jeśli "to" wyciekło bardzo wcześnie w konstruktorze . Ale JVM (podobno) zapewnia, że nie możesz przeciekać tego wcześniej. –