Jestem nowy w programowaniu obiektowym i ciągle napotyka ten problem. (Programuję w Javie) Byłem trochę niechętny, aby o to zapytać, ponieważ wydaje się to tak podstawowym problemem, ale nie mogę znaleźć tutaj żadnych informacji ani pytań na ten temat, a żadne z nich nie podręczniki, które przeczytałem (na dość podstawowym poziomie) dotknęły tej kwestii:
Często muszę śledzić wszystkie obiekty klasy, które zostały utworzone, aby iterować je w różnych celach. Ze względu na sposób, w jaki obecnie piszę programy, do wielu obiektów odwołuje się tylko inne obiekty, co oznacza, że nie mam tablicy ani kolekcji, z którymi można by się do nich odwoływać.
Wyobrażam sobie, że skoro wydaje się to tak bardzo podstawową koniecznością w OOP, powinna istnieć dość zinstytucjonalizowana i prosta droga do tego? Czy zwykle stosuje się osobną listę wszystkich obiektów klasy?
Myślałem o statycznej tablicy lub kolekcji, do której poprzez konstruktor dodawany byłby każdy nowy obiekt. Nie działałoby to jednak z podklasami, ponieważ konstruktory nie są dziedziczone?
Zdaję sobie sprawę, że to pytanie może nie mieć jednej łatwej odpowiedzi; Mam tylko nadzieję, że ktoś może mnie trochę oświecić na ten temat. Mam wrażenie, że brakuje mi tutaj centralnej wiedzy.
Odpowiedzi:
Nie wiem, dlaczego musisz prowadzić listę wszystkich instancji klasy.
Spowodowałoby to wyciek pamięci, ponieważ obiekty te nigdy nie zostaną usunięte, ponieważ lista nadal będzie się do nich odwoływać, jeśli żadna inna klasa tego nie zrobi.
Ale jeśli naprawdę chcesz podążać tą trasą:
Nawiasem mówiąc: konstruktory są dziedziczone.
źródło
Należy zauważyć, że słabych referencji można używać w połączeniu z innymi podanymi rozwiązaniami, aby umożliwić śmieciarzowi usuwanie obiektów śledzonych, gdy nie są one już przywoływane gdzie indziej. Eliminuje to wycieki pamięci bez konieczności ręcznego usuwania obiektów w innym miejscu lub dbania o to, aby były śledzone. Możesz podać ReferenceQueue, aby otrzymywać powiadomienia o referencjach do uwolnionych obiektów.
Konstruktory klas bazowych są wywoływane przed konstruktorami klas pochodnych. Każda klasa ma co najmniej jednego konstruktora i konstruktorów nie można zastąpić.
źródło
Podczas tworzenia gier ludzie czasami chcą kolekcji „samozarządzającej” każdego typu obiektu gry.
Jedna implementacja wygląda następująco:
W ten sposób metody manipulujące kolekcją mogą być deklarowane jako statyczne, podczas gdy metody niestatyczne manipulują instancją (updateAll vs. update).
Choć jest to bardzo przydatne w przypadku bardzo prostych scenariuszy, przy nawet umiarkowanej złożoności zwykle najlepiej jest tworzyć osobne klasy menedżerów.
źródło
static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();
i pomiń statc {..}uptdateAll(){..;}
Spróbuj pomyśleć kontekst. Tworząc obiekt, robisz to w określonym kontekście. Na przykład, jeśli gra polega na strzelaniu do kosmitów, twoja aplikacja będzie cały czas tworzyć nowe obiekty kosmitów. Zostaną wyświetlone w polu o nazwie Space (która może być klasą reprezentującą główny interfejs użytkownika).
To zupełnie naturalne, że Space ma właściwość o nazwie currentAliens, która byłaby tablicą, do której dodajesz każdego nowo utworzonego kosmitę. Jeśli chcesz pozwolić swojemu użytkownikowi rozerwać tkaninę czasoprzestrzeni i zniszczyć wszystkich kosmitów na raz, przejdziesz przez tę kolekcję i zniszczysz każdy obiekt.
Jeśli chcesz mieć dostęp do tej kolekcji kosmitów z innych części aplikacji (np. Ze strony Ustawienia, na której możesz zezwolić użytkownikom na usunięcie niektórych rodzajów obcych za jednym zamachem), kontekst Ustawienia należy uzyskać dostęp do obiektu Space.
źródło