Я новичок в объектно-ориентированном программировании и продолжаю сталкиваться с этой проблемой. (Я программирую на Java) Я немного неохотно спрашиваю об этом, поскольку это кажется такой основной проблемой, но я не могу найти какую-либо информацию по этому вопросу или вопросы по этому поводу здесь, и ни один из Учебники, которые я прочитал (на довольно базовом уровне, конечно), затронули эту проблему:
Часто мне нужно отслеживать все объекты класса, которые были созданы, чтобы перебирать их для различных целей. Они, как я сейчас пишу программы, на многие объекты ссылаются только из других объектов, то есть у меня нет массива или коллекции, с которой можно ссылаться на них все.
Я полагаю, что, поскольку в ООП это кажется такой фундаментальной необходимостью, должен быть достаточно институционализированный и простой способ добиться этого? Является ли обычной практикой ведение отдельного списка всех объектов класса?
Я думал о статическом массиве или коллекции, в которую через его конструктор будут добавляться все новые созданные объекты. Это однако не будет работать с подклассами, так как конструкторы не наследуются?
Я понимаю, что на этот вопрос может не быть простого ответа; Я просто надеюсь, что кто-то может немного просветить меня по этому вопросу. Я чувствую, что мне не хватает центральной части знаний здесь.
Ответы:
Я не знаю, почему вам нужно вести список всех экземпляров класса.
Это может привести к утечке памяти, поскольку эти объекты никогда не будут уничтожены, поскольку список будет по-прежнему ссылаться на них после того, как этого не сделает другой класс.
Но если вы действительно хотите следовать по этому пути:
Кстати: конструкторы наследуются.
источник
Следует отметить, что слабые ссылки могут использоваться в сочетании с другими данными решениями, чтобы сборщик мусора мог избавиться от отслеживаемых объектов, когда на них больше нет ссылок в другом месте. Это устраняет утечки памяти, не требуя кода в другом месте для удаления объектов вручную или иным образом заботясь о том, чтобы они отслеживались. Вы можете предоставить ReferenceQueue для получения уведомления о ссылках на объекты, которые были освобождены.
Конструкторы базовых классов вызываются перед конструкторами производных классов. Каждый класс имеет по крайней мере один конструктор, и конструкторы не могут быть переопределены.
источник
При создании игр людям иногда требуется «самоуправляемая» коллекция игровых объектов каждого типа.
Одна реализация выглядит так:
Таким образом, методы, управляющие коллекцией, могут быть объявлены статическими, в то время как нестатические методы управляют экземпляром (updateAll или update).
Хотя это подходит для очень простых сценариев, но даже с умеренной сложностью обычно лучше создавать отдельные классы менеджера.
источник
static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();
и подавить статистику {..}uptdateAll(){..;}
Попробуйте продумать контекст. Когда вы создаете объект, вы делаете это в определенном контексте. Например, если ваша игра о стрельбе по инопланетянам, ваше приложение будет постоянно создавать новые инопланетные объекты. Они будут отображаться в поле с именем Space (это может быть класс, представляющий основной пользовательский интерфейс).
Для Space вполне естественно иметь свойство currentAliens, которое будет массивом, к которому вы добавляете каждого нового созданного вами пришельца. Если вы хотите позволить своему пользователю разорвать ткань пространства-времени и уничтожить сразу всех инопланетян, вы должны пройти по этой коллекции и уничтожить каждый объект.
Если вы хотите иметь доступ к этой коллекции пришельцев из других частей вашего приложения (скажем, со страницы настроек, где вы можете разрешить пользователям уничтожать определенные типы пришельцев одним махом), контекст ваших настроек будет нужно предоставить доступ к космическому объекту.
источник