IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

une fonction Generics


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut une fonction Generics
    Re-bonsoir (eh oui, c'est mon deuxieme post ce soir ! )

    je ne connais pas très bien les Generics, mais je crois que ceux-ci peuvent m'être utiles pour ce que je fais.

    Je crée une fonction qui ajout un objet dans une liste. Seulement, j'ai quatres listes, et quatres types d'Objet.
    J'ai donc pour l'instant quatres fonctions qui font exactement la même chose, c'est un peu bête...

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(new Objet() );
    		}
     
    	}

    Est-ce possible d'implémenter cette fonction avec la méthode Generics pour pouvoir l'utiliser plusieur fois avec par exemple MonObjet1 que je met dans listeObjet1 et MonObjet2 que je met dans listeObjet2 ??

    Merci.

    Pirokkk.

  2. #2
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    J'ai donc pour l'instant quatres fonctions
    deja faut prendre de bonnes habitudes, en java y'as plus de fonctions, on parle de methodes ...


    pour declarer une liste generic de String (par exemple) fais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<String> liste = new ArrayList<String>();
    pour ajouter des Objets a ta liste tu fais
    tu remarquera que la méthode add n'accepte que le type String (d'ou ArrayList<String>)

    j'espere que ca va t'aider

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Pour que les generics te servent il faut que tes 4 types d'objets aient une relation de parenté. Par exemple si ils héritent tous d'une classe mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class parent {}
    class enf1 {}
    class enf2 {}
    class enf3 {}
    class enf4 {}
     
    List<parent> liste1 = new ArrayList<parent>
    // ou encore
    List<? extends parent> liste2 = new ArrayList <? extends parent>
    Enfin bref, il faut qu'ils aient un minimum en commun ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Ah oui mince je me suis encore trompé en parlant de fonction...c'est un reflexe que j'ai du mal à corriger ! Veuillez m'en excuser.

    Sinon pour répondre à ta question in, mes quatre objets sont tous étendu d'une classe mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Objet1 extends ClasseMere
    Objet2 extends ClasseMere
    Objet4 extends ClasseMere
    Objet4 extends ClasseMere
    Et je déclare mes ArrayList d'objets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Objet1> listeMacons = new ArrayList<Objet1>();
    List<Objet2> listeMacons = new ArrayList<Objet2>();
    List<Objet3> listeMacons = new ArrayList<Objet3>();
    List<Objet4> listeMacons = new ArrayList<Objet4>();

  5. #5
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    Si ce choix est fondamentalement important pour ta classe elle-même, tu en fais une classe générique et tu récupères le type donné en paramètre à ta classe pour typer ta liste.

  6. #6
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    Au fait, en utilisant les generics, tu ne pourras plus instancier tes objets dans les méthodes ajoutMonObjet :-)
    Solution: passage par un factory (où par reflection, mais gore comme méthode).

    Bonne chance.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    Au fait, en utilisant les generics, tu ne pourras plus instancier tes objets dans les méthodes ajoutMonObjet :-)
    Solution: passage par un factory (où par reflection, mais gore comme méthode).
    Tu peux très bien cumuler réflection et generics. Seul défaut tu ne peux pas vérifier l'existence du constructeur vide à la compilation et tu dois donc gérer des exceptions mais c'est faisable (et pas si laid) :

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	// Appel newInstance en encapsulant les éventuelles exceptions dans une Runtime :
    	private static <T> T newInstance(Class<T> type) {
    		try {
    			return type.newInstance();
    		} catch (Exception e) {
    			throw new RuntimeException("No empty constructor", e);
    		}
    	}
     
    	public <T> void ajoutMonObjet(List<T> listeObjet, Class<T> type, int nbObjets) {
    		for(int i=1; i<=nbObjets; i++) {
    			listeObjet.add( newInstance(type) );
    		}
    	}
    a++

  8. #8
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    @adiGuba: En fait, j'avais pensé à la méthode sans passage du paramètre de type Class<T>, où on récupère ce Class depuis le type générique T, et là, c'est gore !
    Mais l'inconvénient principal est comme tu l'as noté le cas où y'a pas de constructeur par défaut (sans paramètres).
    C'est pour cela que je préfère passer par une factory.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    @adiGuba: En fait, j'avais pensé à la méthode sans passage du paramètre de type Class<T>, où on récupère ce Class depuis le type générique T, et là, c'est gore !
    C'est même infaisable avec une méthode Generics (je parle bien d'une méthode Generics et non pas d'une méthode utilisant des paramètres Generics).

    Citation Envoyé par djo.mos Voir le message
    Mais l'inconvénient principal est comme tu l'as noté le cas où y'a pas de constructeur par défaut (sans paramètres).
    C'est pour cela que je préfère passer par une factory.
    En effet, mais la factory est un tout petit plus plus lourde...

    A noter que si tu utilises des java beans le constructeur par défaut est normalement toujours présent

    a++

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Je vous remercie pour votre implication et votre interêt !!

    Pourrais-je avoir quelques explications sur "factory", je ne connais pas du tout ??

    Je m'y perds un peu dans tout ça...finalement....plutôt factory ou méthode utilisant des paramètres Generics ?? lol...

    Merci à vous !

  11. #11
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.

    Comme dit avant, si tu passes par des generics:
    Tu ne pourras plus faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(new Objet() );
    		}
     
    	}
    Plus exactement, le new Machin, car tu travailleras sur des types génériques.
    Pour pouvoir créer des instances d'un type générique T, tu fais comme l'a montré adiGuba ou encore via une factory, qui est une classe intermédiaire qui s'occupe de la création d'objets.
    Exemple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Object1Factory {
      public Objet1 create(){
        return new Objet1();
      }
    }
    Pas sorcier ...
    Mais pour faire un traitement générique, il te faut une factory générique.
    On crée donc ue interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface IFactory<T> {
     T create();
    }
    Et comme implémentation, tu en crées 4, une pour chaque type.
    Tu passes ensuite la factory à la clase de traitement, et ta méthode devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(factory.create());
    		}
     
    	}
    Bref, ça a l'air compliqué, mais ce n'estpas vraiment le cas. Faut juste expérimenter un peu ...
    En fait, pour comprendre une solution, il faut d'abord comprendre le problème Et tout devient facile après !

  12. #12
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Citation Envoyé par Pirokkk Voir le message
    Re-bonsoir (eh oui, c'est mon deuxieme post ce soir ! )

    je ne connais pas très bien les Generics, mais je crois que ceux-ci peuvent m'être utiles pour ce que je fais.

    Je crée une fonction qui ajout un objet dans une liste. Seulement, j'ai quatres listes, et quatres types d'Objet.
    J'ai donc pour l'instant quatres fonctions qui font exactement la même chose, c'est un peu bête...

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(new Objet() );
    		}
     
    	}

    Est-ce possible d'implémenter cette fonction avec la méthode Generics pour pouvoir l'utiliser plusieur fois avec par exemple MonObjet1 que je met dans listeObjet1 et MonObjet2 que je met dans listeObjet2 ??

    Merci.

    Pirokkk.
    heu, pourquoi ne pas ajouter qu'un objet à la fois pour ainsi pouvoir utiliser les Generics
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void ajoutMonObjet(T objet)
    	{
    		listeObjet.add(objet);
     
    	}
    PS: je suis pas sur de la syntaxe, mais l'esprit est là
    Where is my mind

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par Pirokkk Voir le message
    Pourrais-je avoir quelques explications sur "factory", je ne connais pas du tout ??
    Voir Fabrique.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 14h50
  2. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo