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 :

Accessibilité classes java


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Accessibilité classes java
    Bonjour à tous,

    Je viens vers vous car un problème se pose à moi :
    J'ai actuellement 1 classe que l'on va appeler classeA et une autre classe que l'on va appeler classe B
    La classe B se trouve actuellement dans la classe A c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class A (){
    public class B() {
    }
    }
    J'ai une troisième classe que l'on va appeler class C dans laquelle j'ai une variable _A qui correspond à un appel de classe A (private A _A, dans cette classe j'ai besoin d'effectuer la manipulation suivante :
    Le problème est lorsque j'essaye de faire ce new j'ai une erreur de type "no enclosing instance of type A is accessible. Must qualify the allocation with an enclosing instance of type A."

    Je pense qu'il faut que je me tourne vers les singletons mais je ne suis pas sur, si vous pouviez m'aiguiller un peu.

    Merci d'avance de votre aide.

    Cordialement,

    Marc

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Va surtout falloir que tu nous donnes plus de code parce qu'avec les éléments que tu donnes, il n'y a aucune raisons que tu ne puisses pas faire un new A()...

    D'ailleurs, si le problème c'est la classe A, pourquoi tu nous parles de la classe B?
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour eulbobo,

    Tout d'abord merci de ta réponse, tu as justement raison j'ai fait une erreur dans l'énoncé en fait je souhaite faire un new de la classe B dans la classe C (et non la classe A). Lorsque j'essaye de le faire j'ai l'erreur que j'ai fourni un peu avant.

    Merci encore de ton aide.

    Cordialement,

    Marc

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est plus clair comme ça, en effet. Encore faudrait-il nous donner ton vrai code qui compile, et pas une imitation...

    Donc tu as un code qui est à priori comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class A {
       public class B {
       }
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class C {
     
       private B _B;
     
       public C() {
               _B = new B();
       }
     
    }
    La classe B est dite interne à la classe A, donc si comme si elle n'existait pas ailleurs que dans A. Seule A peut en créer une instance, ou les classes qui étenderaient A le cas échéant.
    Donc il n'est pas possible de faire _B = new B() dans C...

    C'est ce que dit le message "no enclosing instance of type A is accessible" : il n'y a pas de classe englobante A accessible à l'endroit où tu cherches à instancier B.

    Pour résoudre ce problème, il faut d'abord se poser la question : pourquoi B est elle interne à A. Si cette classe à besoin d'être instanciée ailleurs que dans A, elle n'a rien à y faire. Si on a besoin de cette classe à l'intérieur de A, on la met dans A, et on ne s'en sert pas ailleurs que dans A.

    On peut parfois, mettre une classe statique interne dans une classe : lorsque la classe statique est très liée à A, mais qu'on a besoin de l'instancier en dehors de A (car dans ce cas on pourrait l'instancier). Mais on peut toujours se débrouiller avec classes séparées, et package pour éviter des classes statiques. Le seul cas où ça peut vraiment être mieux d'avoir la classe statique en interne à mon avis, ce serait éventuellement, pour une enum.

    NB: Au passage, j'ai l'impression que tu nous donnes des faux noms de classes et variables pour simplifier ta question. Si ce sont les vrais noms, note qu'il y a des conventions d'une part, et qu'un nom plus significatif est toujours préférable, que cela soit pour les classes comme pour les variables.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour joel.drigo,

    En fait, travaillant dans un domaine plutôt sensible je ne peux donner exactement le nom des classes et méthodes voila pourquoi je les ai renommé par A, B et C. J'essaierai de copier une partie du code demain lorsque je serais au boulot afin que vous ayez un peu plus de précisions. Dans l'ensemble j'ai compris ce que vous m'expliquiez donc j'essaierai tout cas.

    Encore merci de votre aide.

    Cordialement,

    Marc

  6. #6
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    La classe B interne n'est disponible qu'avec une instance de la classe A vu qu'elle n'est pas statique.
    Du coup, pour récupérer une instance de B, il faut déjà que tu aies une instance de A, du coup tu peux faire comme ça (attention c'est moche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B bb = new A().new B();
    Ou encore comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A aa = new A()
    B bb = aa.new B();

    Mais prends en considérations ce qu'à dit @joel.drigo plus haut : une classe interne est souvent très lié a son instance et n'a souvent d'existence uniquement DANS cette instance... Et pas réellement vocation à être utilisé ailleurs (sauf conception applicative toute pourrie)
    Je ne suis pas mort, j'ai du travail !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour eulbobo, joel.drigo,

    J'ai testé ta solution eulbobo mais celle ci me retourne une erreur "ERROR MainLoop - Error java.lang.NullPointerException".
    Je vais essayé de détailler un peu plus mon cas :
    J'ai une class qui gère la création d'un panel "panelEvenement" et une autre classe interne "ongletComportement" ce qui correspond aux classes A & B
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public PanelEvenement(IScenarioDocument document, MelMil melmil, EvenementMelMil evt, ElementMelMil parent)
       {
     
           super(evt);
          _document = document;
          _parent = parent;
          _melmil= melmil;
     
          JPanel ongletGeneral = new JPanel();
          initOngletGeneral(ongletGeneral);
     
          JTabbedPane ongletEMail= new JTabbedPaneEx();
          initOngletEMail(ongletEMail);
          initOngletCorpsMail(_panelEMailBody);
     
          JPanel ongletRemarques = new JPanel();
          initOngletRemarques(ongletRemarques);
     
          _onglets = new JTabbedPaneEx();
          _onglets.insertTab(getLabel("OngletGeneral"), null, ongletGeneral, "", ONGLET_GENERAL);
          _onglets.insertTab(getLabel("OngletEMail"), null, ongletEMail, "", ONGLET_EMAIL);
          _onglets.insertTab(getLabel("OngletComportement"), null, _ongletComportement = new OngletComportement(), "", ONGLET_COMPORTEMENT);
          _onglets.insertTab(getLabel("OngletRemarques"), null, ongletRemarques, "", ONGLET_REMARQUES);
     
          setLayout(new BorderLayout());
          add(_onglets, BorderLayout.CENTER);
     
     
    	public class OngletComportement extends LinePanel
    	{
          int _graphRow;
          PanelGraphe _panelGraphe;
          PlatformEditor _edPlateforme;
          BooleanEditor _edEmission;
          BooleanEditor _edVeto;
     
          public OngletComportement()
          {
             _edEmission = (BooleanEditor) PanelEvenement.this.addEditLine(this, "EmettreComportement");
     
             _edPlateforme = new PlatformEditor(_document).setReturnString(true);
             addEditor("IdPfCibleComportement", _edPlateforme);
     
             addLine(getEditorLabel("IdPfCibleComportement"), _edPlateforme);
     
             _edVeto = (BooleanEditor) PanelEvenement.this.addEditLine(this, "ConfirmationSurComportement");
     
             addLine(new MultiLineLabel(getLabel("CompAAffecter")), TableLayoutConstants.PREFERRED, TableLayoutConstants.FULL);
             TableLayout tableLayout = getLayout();
             _graphRow = tableLayout.addRow(TableLayoutConstants.FILL);
             recreerPanelGraphe();
          }
     
       }
    }
    Et j'ai une autre classe externe aux 2 précedentes que j'ai appelé C et qui correspond PanelIncident :

    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
     
    public PanelIncident(IScenarioDocument document, MelMil melmil, IncidentMelMil incident, ElementMelMil parent)
       {
          super(incident);
          _document = document;
          _parent = parent;
          _melmil = melmil;
     
          JPanel ongletGeneral = new JPanel();
          initOngletGeneral(ongletGeneral);
     
     
          JTabbedPane ongletEMail= new JTabbedPaneEx();
          initOngletEMail(ongletEMail);
     
          initOngletCorpsMail(_panelEMailBody);
     
          JPanel ongletRemarques = new JPanel();
          initOngletRemarques(ongletRemarques);
     
          _onglets = new JTabbedPaneEx();
          _onglets.insertTab(getResBundle().getLabel("OngletGeneral"), null, ongletGeneral, "", ONGLET_GENERAL);
    	//Cette ligne est à modifiée
          _onglets.insertTab(getLabel("OngletComportement"), null,  _ongletComportement = new OngletComportement(), "", ONGLET_COMPORTEMENT);
          _onglets.insertTab(getLabel("OngletEMail"), null, ongletEMail, "", ONGLET_EMAIL);
          _onglets.insertTab(getResBundle().getLabel("OngletRemarques"), null, ongletRemarques, "", ONGLET_REMARQUES);
     
          setLayout(new BorderLayout());
          add(_onglets, BorderLayout.CENTER);
       }
    Comme vous pouvez le constater la ligne à modifier est la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     _onglets.insertTab(getLabel("OngletComportement"), null,  _ongletComportement = new OngletComportement(), "", ONGLET_COMPORTEMENT);
    Car on me demande de faire apparaître l'onglet comportement dans le panel Incident.

    En vous remerciant par avance de votre aide et en espérant avoir été un peu plus clair.

    Cordialement,

    Marc

  8. #8
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par marc.L Voir le message
    J'ai testé ta solution eulbobo mais celle ci me retourne une erreur "ERROR MainLoop - Error java.lang.NullPointerException".
    Donc je confirme ce que je disais plus haut : la classe B n'a de sens qu'au sein d'une classe A correctement instanciée/initialisée et n'a pas lieu d'être en dehors de cette classe... Du coup, la classe B ne devrait même pas être visible des autres classes...


    Ta classe OngletComportement est intimement liée à la classe PanelEvenement, tu ne peux pas utiliser cette classe ailleurs. D'ailleurs, en y regardant de plus près, je ne vois pas l'intérêt d'utiliser une classe interne (qui devrait être utilisée pour créer un comportement particulier...) plutôt que juste pour ajouter des éléments à un panel.
    Ce qui nous pousse dans ma deuxième remarque plus haut : piètre conception générale de l'application...

    Deux solutions : soit tu peux extraire la classe OngletComportement dans une jolie classe pas du tout interne (du coup, il faudra modifier un peu tout ça pour que ça fonctionne), soit tu fais un truc moche : tu copie le code de OngletComportement dans TA classe... Mais c'est très moche...
    Je ne suis pas mort, j'ai du travail !

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour eulbobo,

    Merci de ta réponse. OK je vois ce que tu veux dire, je suis d'accord la conception a été mal réalisée. J'ai repris le projet dans l'état dans lequel il était sans en avoir l'historique la personne étant parti entre temps.
    Je vais essayer comme tu l'as dit d'extraire la class afin de pouvoir l'utiliser comme classe générique.

    Encore merci de ton aide je te tiens au courant de mon avancée.

    Cordialement,

    Marc

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Encore merci à vous eulbobo et Joel.drigo j'ai réussi à pallier le problème en extrayant la classe et en l'utilisant comme une classe générique.
    Je passe le sujet en résolu


    Cordialement,

    Marc

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

Discussions similaires

  1. [Framework] Accessibilité des properties dans classe Java
    Par zulot dans le forum Spring
    Réponses: 1
    Dernier message: 03/01/2012, 09h41
  2. Réponses: 13
    Dernier message: 25/03/2005, 11h00
  3. convertisseur de classe C++ vers classe Java ?
    Par novice12 dans le forum C++
    Réponses: 3
    Dernier message: 16/12/2004, 21h37
  4. classes java [débutant]
    Par glurps dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/06/2003, 15h57
  5. Inserer des classes java existantes
    Par 2000 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/03/2003, 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