Instance d'une classe
Fermé
Utilisateur anonyme
-
3 déc. 2014 à 20:50
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 - 7 déc. 2014 à 18:46
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 - 7 déc. 2014 à 18:46
A voir également:
- Instance d'une classe
- Retrouver photo de classe gratuitement ✓ - Forum Loisirs / Divertissements
- Copain d'avant photo de classe - Forum Réseaux sociaux
- Dans le code de la page, modifiez la couleur de fond de la classe .pix. un code de 4 chiffres doit apparaître dans la grille. lequel ? ✓ - Forum Programmation
- Bluetooth mercedes classe a 2005 - Forum Autoradio
- Classe ram - Guide
3 réponses
tksteph
Messages postés
204
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
3 janvier 2018
25
6 déc. 2014 à 05:33
6 déc. 2014 à 05:33
Tu pourrais utiliser un initiateur statique que tu remplirai à chaque instanciation de ta classe (Comme Le Patron Singleton si tu vois ce que c'est:)
Ta classe ressemblerait à ça:
Et la méthode getInstances() te retourne la liste de toutes les instances de sécrétaires crées.
Ta classe ressemblerait à ça:
class Secretaire{
/*
Ici attributs de la classe
*/
private static List instances = new ArrayList();
public static Secretaire nouvelleSecretaire() {
Secretaire s = new Secretaire();
/*Initialiser la Sécretaire ici */
instances.add(new java.lang.ref.WeakReference(s));
return s;
}
public static List getInstances() {
return instances;
}
/*
Ici les autres méthodes
*/
}
Et la méthode getInstances() te retourne la liste de toutes les instances de sécrétaires crées.
Utilisateur anonyme
6 déc. 2014 à 15:36
6 déc. 2014 à 15:36
merci beaucoup pour la réponse mais j'ai une autre question si possible :comment je vais faire dans la classe main est ce que je doit créer un objet de la classe secrétaire puis je fais une appelle a la méthode getInstances() ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
6 déc. 2014 à 15:48
6 déc. 2014 à 15:48
Ça dépend de quel code on parle...
Avec le code de tksteph :
Avec le mien :
Avec le code de tksteph :
public static void main(String[] args) { Secretaire secretaire1 = Secretaire.nouvelleSecretaire(); Secretaire secretaire2 = Secretaire.nouvelleSecretaire(); for (Object obj : Secretaire.getInstances()) { WeakReference ref = (WeakReference) obj; Secretaire sec = (Secretaire) ref.get(); System.out.println(sec); } }
Avec le mien :
public static void main(String[] args) { Secretaire secretaire1 = new Secretaire(); Secretaire secretaire2 = new Secretaire(); for (Secretaire sec : Secretaire.getInstances()) System.out.println(sec); }
Utilisateur anonyme
6 déc. 2014 à 18:52
6 déc. 2014 à 18:52
j'ai bien compris alors merci bien c gentil de votre part kx
6 déc. 2014 à 14:45
Quelques remarques :
1) Une liste, comme toutes les collections devraient être paramétrées avec le type de leur contenu.
C'est d'autant plus important ici qu'en réalité dans ton exemple ce ne sont pas des objets Secretaire que tu stockes dans ta liste, mais des WeakReference, j'y reviendrais.
2) Vu ce que l'on veut faire ici, il est intéressant de mettre la liste final et il serait également bon de renvoyer une copie de la liste dans le getInstances, sinon autant mettre la liste public....
3) Pour faire ton patron singleton en Java, il faudrait que la classe Secretaire soit final, et que le constructeur sans argument soit private, sinon on pourrait facilement (par héritage par exemple) créer un nouveau constructeur pour avoir un objet Secretaire qui ne serait pas inséré dans la liste.
Cependant, quitte à mettre la classe final, on peut du coup gérer l'ajout dans la liste directement dans le constructeur et ainsi éviter la méthode nouvelleSecretaire.
4) Les WeakReference sont un peu maladroites ici, mais ça veut dire que si l'objet Secretaire est garbage collecté, la référence n'existera plus mais la liste va continuer à la contenir, on pourrait donc se retrouver avec une liste qui continue à grossir quitte à ne contenir que des WeakReference vides...
Je pense qu'il serait plus propre d'utiliser la méthode finalize afin de supprimer directement la référence dans la liste lorsque l'objet disparaît, même si le problème de raouia1 était sûrement de garder ces objets indéfiniment dans la liste, même s'ils ne sont plus utilisés ailleurs.
6 déc. 2014 à 16:31
La bonne solution serait donc entre les deux : utiliser des WeakReference ou SoftReference pour permettre le GC de l'objet et lors du finalize supprimer de la liste la référence associée.
Mais clairement ce n'est pas d'un niveau débutant ;-)
7 déc. 2014 à 18:46