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

Java Discussion :

Annuler un objet lors de sa construction


Sujet :

Java

  1. #1
    Invité
    Invité(e)
    Par défaut Annuler un objet lors de sa construction
    Bonjour,

    J'ai un objet (disons conteneur), qui en contient un autre (disons contenu). J'aimerais que lors de la construction de contenu, si certaines conditions ne sont pas réalisées, l'objet s'initialise à null.

    Le plus simple est d'illustrer immédiatement mon problème par du code.

    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
    public class Test2
    {
    	private Test1 t1;
     
    	public Test2()
    	{
    		this.t1 = new Test1(this);
    	}
     
    	public void set(Test1 t1)
    	{
    		this.t1 = t1;
    	}
     
    	public Test1 get()
    	{
    		return t1;
    	}
     
    	public static void main(String[] args)
    	{
    		Test2 t2 = new Test2();
    		System.out.println(t2.get() == null);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Test1
    {
    	public Test1(Test2 t2)
    	{
    		t2.set(null);
    	}
    }
    Pourquoi est-ce que l'exécution de ce programme m'affiche false, et comment résoudre ce problème ?

    Merci d'avance,

    Maxime

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ce genre de code est vraiment à éviter...

    Mais le résultat est logique. Si on prend le constructeur de t2 :

    this.t1 = new Test1(this);

    Voici ce qui va être fait

    exécuter constructeur de Test1
    t2.set(null); ==> donc t1 dans Test2 = null
    retourner du constructeur
    this.t1 = new Test1(this); ==> donc t1 dans Test2 = new Test1(this);
    On ne peut pas stopper un constructeur et lui faire retourner null...

    La solution c'est de tester les conditions dans Test2 et si elle se réalisent instancier Test1, sinon ne rien faire et laisser t1 à null.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je ne peux pas tester les conditions dans conteneur, parce qu'en fait contenu appartient à une classe abstraite dont chacune des classes filles a ses propres conditions d'existence.

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par MBarthOut Voir le message
    Je ne peux pas tester les conditions dans conteneur, parce qu'en fait contenu appartient à une classe abstraite dont chacune des classes filles a ses propres conditions d'existences.
    Alors, il faut que tu utilises une factory qui va contrôler les conditions d'existences. Et qui, si les conditions ne sont pas vérifiées, va te retourner un objet null.

    Tu devrais regarder du côté du design pattern Abstract Factory qui devrait satisfaire tes exigences.

    Sinon, un workaround simple mais très moche serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this.t1 = new Test1(this);
     
    if(t1.isNotValid()){
        this.ti = null;
    }
    mais une solution avec design pattern sera beaucoup plus propre et souple.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci de la réponse.

  6. #6
    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
    Salut,


    Le constructeur de Test1 qui référence Test2 pour modifier la référence de Test1 dans le constructeur de ce dernier qui recevra le résultat du constructeur de Test1 ! Tout ceci est bien alambiqué


    Tu ne peux pas retourner null depuis un constructeur. Tout ce que tu peux faire c'est remonter une exception et la traiter.

    Tu peux éventuellement utiliser une méthode factory pour cela :
    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
    class Test {
     
    	public Test() {
    		if (condition) {
    			throw new IllegalStateException("info");
    		}
    	}
     
    	public static Test create() {
    		try {
    			return new Test();
    		} catch (IllegalStateException e) {
    			return null;
    		}
    	}
    }
    a++

Discussions similaires

  1. Erreur de syntaxe lors de la construction d'un lien
    Par sosophie dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/06/2007, 17h02
  2. [MySQL] Erreur lors de la construction d'une requête
    Par gaetan24 dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 06/04/2007, 15h45
  3. Réponses: 1
    Dernier message: 06/09/2006, 18h11
  4. Réponses: 11
    Dernier message: 07/12/2005, 23h09
  5. Réponses: 1
    Dernier message: 09/07/2005, 18h16

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