web-dev-qa-db-fra.com

Garder une trace de tous les objets d'une classe

Je suis nouveau dans la programmation orientée objet et je continue à courir dans cette question. (Je suis en train de programmer en Java) J'ai été un peu réticent à poser à ce sujet, car cela semble être un problème aussi fondamental, mais je ne trouve aucune information à ce sujet, ni de questions à ce sujet ici, et aucune des Les manuels que j'ai lus (sur un niveau de base bien sûr) ont abordé ce problème:

Souvent, j'ai besoin de garder une trace de tous les objets d'une classe créée, de les introduire à travers diverses fins. Ils écrivent actuellement des programmes, de nombreux objets ne sont référencés que d'autres objets, ce qui signifie que je n'ai aucun tableau ni de collection avec laquelle vous devez tous les faire référence.

J'imagine que, comme cela semble être une nécessité aussi fondamentale dans OOP, il devrait y avoir un moyen d'aller à ce sujet? Est-il habituel pratique de conserver une liste séparée de tous les objets d'une classe?

J'ai pensé à une matrice ou à une collecte statique, à laquelle par son constructeur, chaque nouvel objet créé serait ajouté. Cela ne fonctionnerait toutefois pas avec des sous-classes, car les constructeurs ne sont pas hérités?

Je réalise que cette question pourrait ne pas avoir une réponse facile; J'espère juste que quelqu'un peut m'éclairer un peu sur ce sujet. Je me sens comme si je manque d'une connaissance centrale ici.

9
zxz

Je ne sais pas pourquoi vous devez conserver une liste de toutes les instances d'une classe.

Cela entraînerait des fuites de mémoire car ces objets ne seront jamais éliminés, car la liste les référencera toujours après qu'aucune autre classe ne le fait.

Mais si vous voulez vraiment suivre cet itinéraire:

  1. Utilisez le motif d'usine. Une classe d'usine avec des méthodes instanciant de la classe et renvoyer les objets. De cette façon, vous avez un point centralisé pour contrôler les instanciations.
  2. Utilisez le modèle singleton pour contenir une liste ou des listes qui détiennent les instances.
  3. Faites mettre l'usine chaque objet d'un certain type dans une liste après les avoir créées.

Au fait: les constructeurs sont hérités.

8
Tulains Córdova

Il convient de noter que références faibles peut être utilisée en combinaison avec les autres solutions données pour permettre au collecteur des ordures de disposer d'objets suivis lorsqu'ils ne sont plus référencés ailleurs. Cela élimine les fuites de mémoire sans nécessiter de code ailleurs pour éliminer manuellement les objets, ou se souciez de ce qu'ils soient suivis. Vous pouvez fournir une référence à recevoir une notification de références à des objets libérés.

J'ai pensé à une matrice ou à une collecte statique, à laquelle par son constructeur, chaque nouvel objet créé serait ajouté. Cela ne fonctionnerait toutefois pas avec des sous-classes, car les constructeurs ne sont pas hérités?

Les constructeurs de classes de base sont invoqués avant les constructeurs de classes dérivées. Chaque classe a au moins un constructeur et des constructeurs ne peuvent pas être remplacés.

3
user2313838

Essayez de penser le contexte. Lorsque vous créez un objet, vous le faites dans un certain contexte. Par exemple, si votre jeu porte sur Shooting Aliens, votre application créera de nouveaux objets extraterrestres tout le temps. Ils seront affichés dans un champ appelé espace (qui pourrait être la classe qui représente l'UI principale).

Il est parfaitement naturel que l'espace ait une propriété nommée Currentaliens, qui serait une matrice, à laquelle vous ajoutez chaque nouvel extraterrestre que vous créez. Si vous souhaitez autoriser votre utilisateur à séparer le tissu de la SPACÉTIME et détruire tous les extraterrestres à la fois, vous iriez itérale à travers cette collection et détruisez chaque objet.

Si vous vouliez avoir accès à cette collection d'extraterrestres provenant d'autres parties de votre application (disons, à partir d'une page Paramètres, vous souhaiterez peut-être autoriser les utilisateurs à éliminer certains types d'étrangers dans un seul Swoop), votre contexte de paramètres serait besoin d'avoir accès à l'objet spatial.

2
Wytze