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 de classe


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut Constructeur de classe
    Bonjour,

    J'aimerais savoir un truc, et je vais essayer au maximum d'être clair mais c'est pas évident :

    Imaginons une classe dont le constructeur prend en argument une String représentant une liste d'entiers.

    Si jamais cette String contient autre chose, alors ça devrait sauter.

    Je ne peux pas dans le constructeur faire un "return null", du coup je suis obligé de lever une exception.

    La solution que j'utilise en général dans ces cas la, c'est une fonction create en static, qui renvoie l'objet ou null :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static MyObject create(String bla)
    Ma question, donc, est : est ce que c'est inutilement compliqué de passer par une fonction create, et si oui, on doit faire comment quand on est malin ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    En général, lorsque une méthode (ou un constructeur) reçoit un paramètre inadéquat (un String qui doit avoir un certain format, un int qui ne doit avoir que certaines valeurs spécifiques, etc), il est d'usage de levé une IllegalArgumentException .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public MyObject(String bla) {
        if(...) { // Si le paramètre ne respecte pas le format attendu
            throw new IllegalArgumentException("invalid string");
        }
        ...
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pourquoi ne pas faire les deux ?


    a++

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Pourquoi ne pas faire les deux ?


    a++
    A moins que le fait de passer par une méthode static soit un choix de design (Singleton ou Factory avec constructeur privé), je ne vois pas trop l'intérêt de faire les deux puisque la méthode static aurait le même comportement que le constructeur.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Je ne peux pas dans le constructeur faire un "return null", du coup je suis obligé de lever une exception.
    pourquoi ca te pose probleme de lever une exception au constructeur?
    comme t a dit le yam's, je crois que c est la meilleur solution.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par jhaythem Voir le message
    pourquoi ca te pose probleme de lever une exception au constructeur?
    comme t a dit le yam's, je crois que c est la meilleur solution.
    En fait, j'essaye au maximum d'éviter les exceptions quand un simple != null suffirait. J'imagine qu'en terme de charge et tout, l'exception est plus lourde.

    Mais bon, je me trompe surement.. Si qqun pouvait rentrer dans les détails

    Merci

  7. #7
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    tu peux toujours gerer ton expection a ta guise apres.
    Mais en question de design, tu es certain d avoir tes objet proprement consctruit que de te balader avec =null et qui sait apres ce qui peut se passer...
    Et personellement je trouve pour le maintien du code apres par d autres personnes sera plus facile avec une exception leve au constructeur.

    Cheers,

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le y@m's Voir le message
    je ne vois pas trop l'intérêt de faire les deux puisque la méthode static aurait le même comportement que le constructeur.
    Le constructeur (public ou protected) permet l'héritage.
    La méthode static permet une "simplification" du fait de l'absence d'exception

    Citation Envoyé par Faiche Voir le message
    J'imagine qu'en terme de charge et tout, l'exception est plus lourde.
    Oui et non : j'avais fait des tests il y a quelques temps, et grosso-modo la différence vient de la génération du stacktrace lors de la création de l'exception. Mais ce n'est sensible que sur de grosse quantité d'appel. De plus en fonctionnement normale (sans erreur) il n'y a pas de différence.

    Par contre les exceptions comportent bien plus d'information et ne devraient pas être dénigré

    Plus d'info : Exception & Performance


    Bref la solution de la méthode static peut être très intéressante si tu dois traiter un grand nombre de donnée potentiellement erroné et que tu n'a pas besoin des infos de l'exception. Mais dans ce cas là il est quand même préférable de proposer également un constructeur pour l'évolutivité de ta classe. Cela pourrait donner ceci :

    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
    class MyObject {
     
    	/** Méthode privée de vérification de la chaine en entrée */
    	private static boolean isValid(String bla) {
    		return true; // ...;
    	}
     
    	/** Constructeur privée permettent de 'sauter' la vérification */
    	private MyObject (String bla, boolean checkEntry) {
    		if (checkEntry && MyObject.isValid(bla)==false) {
    			throw new IllegalArgumentException("invalid string");
    		}
    		// Code du constructeur
    	}
     
    	/** Constructeur public qui impose la vérification */
    	public MyObject(String bla) throws IllegalArgumentException {
    		this(bla, true); // On se contente d'appeller le constructeur privée
    	}
     
    	/** Factory static qui évite la génération de l'exception */
    	public static MyObject create(String bla) {
    		if (MyObject.isValid(bla)) {
    			return new MyObject(bla, false); // Appel du constructeur privé
    		}
    		return null;
    	}
    }


    Citation Envoyé par jhaythem Voir le message
    Mais en question de design, tu es certain d avoir tes objet proprement consctruit que de te balader avec =null et qui sait apres ce qui peut se passer...
    Ben si une exception est généré lors de la construction de l'objet le problème est un peu le même...



    a++

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Citation Envoyé par le y@m's Voir le message
    je ne vois pas trop l'intérêt de faire les deux puisque la méthode static aurait le même comportement que le constructeur.
    Le constructeur (public ou protected) permet l'héritage.
    La méthode static permet une "simplification" du fait de l'absence d'exception
    Ok, j'avais mal compris, je croyais que tu parlais de faire une méthode static qui lèverait elle aussi une exception .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Merci, c'est déjà plus clair

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

Discussions similaires

  1. Constructeurs et classe de base virtuelle
    Par Paul Atreide dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 17h04
  2. Vector et constructeurs de classes
    Par insomniak dans le forum SL & STL
    Réponses: 13
    Dernier message: 13/05/2006, 21h15
  3. Réponses: 3
    Dernier message: 02/05/2006, 08h07
  4. [POO] Constructeur de classe
    Par cescu dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2006, 21h50
  5. Réponses: 7
    Dernier message: 15/07/2005, 15h07

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