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 :

Constructeur récursif en Java objet, une alternative?


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Constructeur récursif en Java objet, une alternative?
    Bonjour à tous,

    Je suis en train de programmer une class objet en Java, un Poisson qui hérite d'un Animal. Je voudrais faire en sorte que lorsque l'utilisateur crée un poisson en précisant en paramètre un type d'eau qui n'existe pas, le programme le lui redemande et ce jusqu'à ce qu'il saisisse une valeur correcte. Puis il crée le Poisson avec la valeur valide saisie en dernier lieu.

    J'aurais volontiers utilisé une boucle while, mais notre prof veut qu'on gère ça avec les Exceptions (on a eu à peine un quart d'heure de cours dessus, donc on doit apprendre à les maîtriser soi-même, un classique).

    Voici ma classe Animal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class Animal
    {
        private String nom;
        private String nourriture;
        private String categorie; //Pour creer un animal d'une categorie etrangere a celles du zoo.
     
        public Animal (String nom, String nourriture, String categorie)
        {
        	this.nom=nom;
        	this.nourriture=nourriture;
        	this.categorie=categorie;
        }
     
        public Animal (String nom, String nourriture)
        {
        	this.nom=nom;
        	this.nourriture=nourriture;
        	this.categorie="Aucune";
        }
     
        public Animal ()
        {
        	this.nom="Sans nom";
        	this.nourriture="Rien";
        	this.categorie="Categorie non mentionnee";
        }
     
        public void setCategorie (String categ)
        {
        	this.categorie=categ;
        }
     
        public String toString ()
        {
        	return(this.nom+" est un "+this.categorie+" qui mange "+this.nourriture);
        }
    }
    Puis ma classe Poisson

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class Poisson extends Animal
    {
        private String type_eau;
    	private String[] types_eau = {"Eau Douce", "Eau de Mer"};
    
        public Poisson (String nom, String nourriture, String type_eau)
        {
        	super(nom,nourriture);
        	super.setCategorie("Poisson");
        	
        	try
        	{
        		Listeur.compatibilite(type_eau, this.types_eau);
        		this.type_eau=type_eau;
        	}
        	catch (IncompatibleException e)
        	{
        		System.out.println(e.getMessage());
        		String a = new String (Saisie.litexte());
        		Poisson (nom, nourriture, a);
        	}
        }
    
        public Poisson (String nom, String nourriture)
        {
        	super(nom,nourriture);
        	super.setCategorie("Poisson");
        	this.type_eau="Eau de Mer";
        }
        
        public Poisson ()
        {
        	super();
        	super.setCategorie("Poisson");
        }
    
        public String toString()
        {
        	return(super.toString()+" Il nage dans de l'"+this.type_eau);
        }
    }
    Ma classe IncompatibleException (je ne sais pas faire plus que ça)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class IncompatibleException extends Exception
    {
    	public IncompatibleException (String mess)
    	{
    		super(mess);
    	}
    }
    Et enfin, ma classe Listeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class Listeur
    {	
    	public static void compatibilite (String mot, String liste[]) throws IncompatibleException
    	{
    		int i=0;
    		while (i<liste.length && !mot.equals(liste[i]))
    		{
    			i++;
    		}
    		if (i==liste.length) //"mot" n'est pas dans "liste"
    		{
    			String toto="Merci de saisir l'une des valeurs ci-dessous en respectant la casse:\n\n- ";
     
    			for (int j=0; j<liste.length-1; j++)
    			{
    				toto=toto+liste[j]+"\n- ";
    			}
    			toto=toto+liste[liste.length-1]+"\n\n";
     
    			IncompatibleException ie = new IncompatibleException (mot+" n'est pas une valeur appropriee. "+toto);
    			throw ie;
    		}
    	}
    }
    Problème: La phrase en italique/gras/gros dans la classe Poisson ne fonctionne pas. Il me dit qu'il n'existe pas de constructeur de type (String String String) pour l'objet Poisson. Qu'est-ce que j'ai comme alternative?

    PS: Merci de ne pas trop donner d'importance aux imperfections de mon programme au niveau code/performance, je suis hyperdébutant et je préfère d'abord régler le problème mentionné, après on verra.

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ca ne marche pas comme ça les constructeurs. Tu ne peux pas rappeler le constructeur à cet endroit car le constructeur parent a déjà été apppelé.

    De plus, il est illogique d'aller relire le clavier dans ton constructeur.
    Fait remonter l'exception en dehors de constructeur, et gère là en dehors. Et là, en dehors, ca deviens logique de redemander l'information à l'utilisteur, et tenter un nouvel appel au constructeur

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Le problème c'est que je ne peux pas remonter l'erreur plus que ça, vu qu'au niveau supérieur je vais devoir la traiter dans le main. Or, c'est précisément là que le prof va créer ses Poissons pour tester mon code. Et s'il voit le try/catch dans le main, il va sûrement essayer de créer un Poisson à côté... tu vois ce que je veux dire?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non, le prof a demandé un exception, il va s'attendre à une exception, ça me semble logique, pas toi?

  5. #5
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par User Name Voir le message
    Le problème c'est que je ne peux pas remonter l'erreur plus que ça, vu qu'au niveau supérieur je vais devoir la traiter dans le main. Or, c'est précisément là que le prof va créer ses Poissons pour tester mon code. Et s'il voit le try/catch dans le main, il va sûrement essayer de créer un Poisson à côté... tu vois ce que je veux dire?
    Euh, ton boulot c'est de faire un programme qui lit le "type d'eau" donné par l'utilisateur et essaie de créer l'objet Poisson correspondant.
    Ton prof va tester le programme en se mettant à la place de l'utilisateur et en tapant "nimportequoi" dans la console, mais il ne va pas modifier ton programme !

    Donc dans ta fonction principale:
    • tu lis l'entrée clavier
    • tu essaies (try) de créer un Poisson, en appelant un constructeur de Poisson avec le "type d'eau" lu plus haut
    • si le type d'eau est bon, le constructeur crée un nouvel objet Poisson sans problème
    • si le type d'eau est mauvais, le constructeur lève une exception, que tu récupères (catch) et que tu traites en bouclant et en redemandant une entrée clavier

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Ah d'accord, je vois ce que tu veux dire, maintenant.
    Effectivement, je n'avais pas pensé au fait que le prof allait utiliser mon programme via la console.

    Une question à part, mais que je me pose depuis assez longtemps : Comment dire en Java : "Si le type de la variable a est x, alors ..."?

    Edit: En fait, je voudrais plutôt dire "Créer un objet du type contenu dans la variable a qui est de type String". Exemple: si a vaut "Poisson", crée un nouveau Poisson. Si a vaut "Mammifere", crée un nouveau Mammifere.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (a instanceof Poisson) {
       //code  pour le poisson
    }

  8. #8
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par User Name Voir le message
    Une question à part, mais que je me pose depuis assez longtemps : Comment dire en Java : "Si le type de la variable a est x, alors ..."?

    Edit: En fait, je voudrais plutôt dire "Créer un objet du type contenu dans la variable a qui est de type String". Exemple: si a vaut "Poisson", crée un nouveau Poisson. Si a vaut "Mammifere", crée un nouveau Mammifere.
    Tester le contenu d'une String, ce n'est pas pareil que tester le type d'une variable...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if ("Poisson".equals(a))
    {
       // faire qqc
    }
    else if ("Mammifere".equals(a))
    {
       // faire autre chose
    }
    else
    {
       // traiter le cas d'une option invalide
    }
    Si le "faire qqc" consiste en créer un objet de tel ou tel type, on peut effectuer le traitement suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Animal b; // Animal est une classe dont dérivent les classe Poisson et Mammifere
    if ("Poisson".equals(a))
    {
       b = new Poisson();
    }
    else if ("Mammifere".equals(a))
    {
       b = new Mammifere();
    }
    else
    {
       // traiter le cas d'une option invalide
    }
    // traitement commun sur l'objet b de type Animal

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Génial, merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/03/2015, 20h56
  2. Invocation méthode objet JAVA dans une fonction JAVASCRIPT
    Par makao dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/10/2010, 23h04
  3. [Conception] Stocker un objet java dans une structure java
    Par m3allem001 dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2009, 08h41
  4. [Facade] Donner une interface objet à une librairie Java, quel est ce pattern ?
    Par Pierre8r dans le forum Design Patterns
    Réponses: 3
    Dernier message: 28/10/2008, 12h19
  5. Appel des objet Java depuis une JSP
    Par Titeuf82 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 07/03/2008, 11h07

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