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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 !

+ 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