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 :

Eclairage sur synthetic-access-method


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ITM
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ITM
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Eclairage sur synthetic-access-method
    Bonjour,

    J'ai programmé une classe A contenant une classe interne privée B.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A {
      private int toto;
     
      private class B {
        int truc() {
    return A.this.toto;
    }
     }
    }
    Eclipse m'indique "Read access to enclosing field A.toto is emulated by a synthetic accessor method". Je ne comprend pas, car dans des livres et autre cours sur le net,
    il est indiqué que la classe interne peut avoir accés à tous les membres de la classe englobante et compris les membres privés. Donc, pour moi, le warning est inutile,
    car pourquoi créer une méthode synthetic alors que l'on peut (normalement ?) accéder à la variable directement ou modifier sa visibilité (ce qui rompt l'encapsulation de toto) ?



    Merci de vos lumières.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Il s'agit d'un avertissement spécifique à Eclipse. Celui-ci t'indique que le compilateur va effectuer une transformation de ton code en générant une nouvelle méthode (synthetic accessor method) pour accéder au champ toto.
    Voici sommairement le code généré :
    Code Java : 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 A {
      private int toto;
      A() {}
      static int access$0(A a) {
        return a.toto;
      }
    }
    class A$B {
      final A this$0;
      private A$B(A a) {
        this$0 = a;
      }
      int truc() {
        A.access$0(this$0);
      }
    }

    Pour Eclipse cela peut poser des problèmes de performance. En réalité à la compilation JIT ce sera très certainement inliné et la différence sera invisible.

    Tu peux voir le résultat de la compilation à l'aide de l'outil "javap" : javap -p 'A.class' 'A$B.class'
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Compiled from "A.java"
    class A {
      private int toto;
      A();
      static int access$0(A);
    }
    Compiled from "A.java"
    class A$B {
      final A this$0;
      private A$B(A);
      int truc();
    }

    Tu peux ensuite lire les instructions byte-code (avec qq commentaires utiles) javap -l -p 'A.class' 'A$B.class'
    Code text : 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
    Compiled from "A.java"
    class A {
      private int toto;
     
      A();
        Code:
           0: aload_0
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V
           4: return
     
      static int access$0(A);
        Code:
           0: aload_0
           1: getfield      #18                 // Field toto:I
           4: ireturn
    }
    Compiled from "A.java"
    class A$B {
      final A this$0;
     
      private A$B(A);
        Code:
           0: aload_0
           1: aload_1
           2: putfield      #10                 // Field this$0:LA;
           5: aload_0
           6: invokespecial #12                 // Method java/lang/Object."<init>":()V
           9: return
     
      int truc();
        Code:
           0: aload_0
           1: getfield      #10                 // Field this$0:LA;
           4: invokestatic  #21                 // Method A.access$0:(LA;)I
           7: ireturn
    }
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Ce warning est d'ailleurs désactivé par défaut dans Eclipse, c'est celui qui se nomme "access to a non-accessible member of an enclosing type"
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    ITM
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ITM
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci de vos réponses.

    Donc, un constructeur interne est créé avec une référence sur l'objet englobant.
    Ce n'est pas ce que j’espérais, je pensais (donc à tort) faire "l'économie" d'un membre, du coup je comprend vraiment mieux ce qui ce passe.


    Merci à Logan Mauzaize pour cette démonstration fort instructive ( et javap que vais surement utiliser de temps en temps)

    Sujet clos.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/02/2006, 18h06
  2. Erreure sur bd access 2003
    Par alias123 dans le forum Access
    Réponses: 4
    Dernier message: 26/12/2005, 16h39
  3. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  4. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46
  5. [VB6] [ADO] Like sur base Access
    Par dlpxlid dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/01/2003, 11h03

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