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 :

récupération de l'objet instanciant un autre objet


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut récupération de l'objet instanciant un autre objet
    Bonjour à tous,

    Après plusieurs recherches sur le net je n'ai pas réussi trouvé de réponse satisfaisante.

    Est-il possible pour un objet (depuis sa classe) de récupérer l'objet qui l'a instancié?

    Dans cet exemple, est-il possible pour b de récupérer a?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class A{
        public B b;
     
        public A(){
             b = new B();
        }
     
        public static void main(){
            A a = new A();
        }
    }

    Merci d'avance pour vos réponses.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    A ma connaissance le seul moyen de faire ça serait de le passer en paramètre au constructeur.
    La JVM fournit l'information des objets qui empêchent un objet d'être collecté mais pas l'information de quel objet en a instancié un autre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'avais déjà imaginé cette solution qui ne me satisfait pas vraiment. Je vais encore réfléchir à la question même si je crains de devoir finalement opter pour cette solution.

    En tous cas, Merci pour la réponse.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quel est le besoin sous jacent derrière. On a régulièrement besoin en java de connaitre l'objet vers lequel reporter des notifications, mais extrêmement rarement de connaître l'objet qui instancie. Le seul cas que je connaisse c'est en cas de fuite mémoire, pour savoir qui a instancié des objet comme un dingue. Et là ce n'est pas l'appelant mais toute la pile appelante dont on a besoin et c'est géré par les outils de debugging type profilers. Ce n'est pas au code de le faire.

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour tchize_,

    l'idée est que l'objet B a besoin d'interagir avec d'autres objets instanciés par l'objet A, ce que j'appellerai son 'environnement', hors il n'y a que l'objet A qui ait connaissance de cette 'environnement'.

    J'aurai voulu pouvoir développer une méthode dans la classe B capable de demander à l'objet A de lui fournir cet 'environnement'. Comme proposé, je pourrai passer la référence de A à la construction de B ou gérer une liste des objets instanciés dans A et la fournir à la construction de B.

    Je cherche juste l'éventail de solutions offertes.

    Si vous avez des idées, je suis preneur.

    Merci

  6. #6
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Si la classe A représente ton "environnement", alors je ne vois pas vraiment ce qui te gène à donner une référence vers tes objets B.

    Maintenant si A est simplement une classe utilitaire qui sait instancier des objets B, alors tu devrais passer par un système d’événement.

    Tes instances de B s'enregistrent dans un contrôleur qui sera chargé de notifier les objets qui le souhaite qu'une modification a eu lieu.

  7. #7
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Nico02,

    j'ai finalement donner une référence de l'objet A vers les objets B.

    Le truc qui me dérange avec cette solution est je dois rajouter cette référence à tous mes objets B et dans un souci d'optimisation j'aurai aimé m'en passer. Je ne peux pas l'ajouter en static car même si n'est pas le cas aujourd'hui, il est possible que j'ai plusieurs A qui instancient d'autres B qui seront indépendants vis-à-vis des autres objets B instanciés dans d'autres objets A.

    Je vais également chercher avec un système d'événements.


    Merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par mr.m.r Voir le message
    dans un souci d'optimisation j'aurai aimé m'en passer.
    T'en passer n'aurait rien optimisé. Pire! Les méthodes permettant de remonter la pile sont extrêmement lentes et sujettes à erreurs
    Citation Envoyé par mr.m.r Voir le message
    Je ne peux pas l'ajouter en static car même si n'est pas le cas aujourd'hui, il est possible que j'ai plusieurs A qui instancient d'autres B
    Et dans la même logique il est possible dans le futur que tu aie besoin d'instancier des B depuis C ou D. Dans tous les cas, B n'a pas besoin de le savoir.

    Dans ce cas on travaille en général avec une interface qui représente les fonctionnalités de A

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface BRepository {
        public B getBByName(String name);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public A implements BRepository {
       //...
    }
    et ensuite, soit on passe en constructeur, ou avec un setter


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public B {
       private BRepository repo;
     
       public B (BRepository repo){ 
          this.repo=repo;
       }
    //...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public B {
       private Repository repo;
     
       public void setRepository(BRepository repo){ 
          this.repo=repo;
       }
    //...
    }
    Ainsi:
    tu peux avoir des repository de types différents sans affecter le code de B
    tu peux instancier tes classes d'où tu veux sans affecter le code de B
    tu n'es pas coincé pour écrire tes unit test.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/04/2008, 10h41
  2. [POO] Gérer des objets associés à d'autres objets
    Par metos00 dans le forum Langage
    Réponses: 1
    Dernier message: 07/10/2007, 22h00
  3. Position d'objet dans un autre objet
    Par Speed41 dans le forum Delphi
    Réponses: 14
    Dernier message: 20/02/2007, 20h51
  4. Réponses: 7
    Dernier message: 10/02/2007, 05h41
  5. Réponses: 6
    Dernier message: 08/09/2004, 12h35

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