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
bonjour
j'ai une classe secrétaire cette dernière contient comme attributs :nom,prénom,niveau,compétence, contact..
mais j'ai pas arriver a faire une liste de toutes les secrétaires répertoriées (toute les instances de la cette classe )
je veux une idée concernant ca .merci

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
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:


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.
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 déc. 2014 à 14:45
Bonjour,

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.

import java.util.ArrayList;
import java.util.List;

public final class Secretaire
{
    private static final List<Secretaire> instances = new ArrayList<Secretaire>();
    
    public static List<Secretaire> getInstances() {
        return new ArrayList<Secretaire>(instances);
    }
    
    public Secretaire() {
        instances.add(this);
    }
    
    @Override
    protected void finalize() throws Throwable {
        instances.remove(this);
        super.finalize();
    }
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 déc. 2014 à 16:31
Edit: ainsi fait les objets ne pourront jamais être garbage collectés puisqu'ils seront dans la liste.
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 ;-)
0
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
7 déc. 2014 à 18:46
Entierement OK!
0
Utilisateur anonyme
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() ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 déc. 2014 à 15:48
Ça dépend de quel code on parle...

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);
}
0
Utilisateur anonyme
6 déc. 2014 à 18:52
j'ai bien compris alors merci bien c gentil de votre part kx
0