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 :

Constante et Compilateur Java


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut Constante et Compilateur Java
    Bonjour, je viens de remarquer quelquechose que je trouve surprenant avec le compilateur java d'oracle.

    Je m'explique :
    Soit A une classe statique qui définie une constante CONST_1 dans un jar JAR1. [module 1 maven]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public final String CONST_1 = "MASTRONG"
    ]

    Soit B une classe qui se sert de la constante CONST_1 dans un JAR2. [module 2 maven]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private final String MA_LOCAL_CONST = CONST_1 + "-LOCAL"
    ]

    Aujourd'hui je dois faire une modification car CONST_1 est mal écrite.


    Je change la valeur de CONST_1 dans JAR1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public final String CONST_1 = "MASTRING"
    ]
    et je re-déploie JAR1 sans toucher au reste (ça me semblait logique).
    La modification n'est pas prise en compte par mon JAR2 (bizarre).

    J'ai donc été décompilé ma class B de mon JAR2 pour comprendre.

    et voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Le code compilé [puis décompilé] pour la classe B me donne ceci pour ma string MA_LOCAL_CONST
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MA_LOCAL_CONST = (new StringBuilder()).append("MASTRONG").append("-LOCAL").toString();

    Le comportement me parait logique quand on a les 2 classes dans le même jar [module maven]. Mais quand on en a plusieurs, je trouve cela plus que surprenant. Si je dois toujours tout recompiler à chaque fois que je modifie un truc ça devient l'enfer [et l'interet de sortir les constantes ?]. Quelqu'un pourrait-il m'expliquer la raison de cette "optimisation" ?

    D'où voici ma question, y'aurait-il une possibilité pour que le compilateur garde la constante et ne copie pas la valeur ?

    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Orni-Dev Voir le message
    Le comportement me parait logique quand on a les 2 classes dans le même jar [module maven]. Mais quand on en a plusieurs, je trouve cela plus que surprenant.
    Le compilateur ne va pas s'amuser à avoir des règles différentes suivant les .jar. On devrait se douter qu'on a soit toujours l'un, soit toujours l'autre.

    Citation Envoyé par Orni-Dev Voir le message
    Si je dois toujours tout recompiler à chaque fois que je modifie un truc ça devient l'enfer [et l'interet de sortir les constantes ?].
    Plutôt d'accord, mais c'est ainsi.
    Pour information, il n'y a jamais eu d'intérêt à sortir les constantes. Les constantes doivent être là où elles doivent être.

    Citation Envoyé par Orni-Dev Voir le message
    Quelqu'un pourrait-il m'expliquer la raison de cette "optimisation" ?
    Ne pas avoir besoin de faire appel à des classes externes pour utiliser des constantes. Comme avec un seul .jar.

    Citation Envoyé par Orni-Dev Voir le message
    D'où voici ma question, y'aurait-il une possibilité pour que le compilateur garde la constante et ne copie pas la valeur ?
    Avec des constantes, non. En gardant une variable finale, oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static String nonConstant(String s) {
      return s;
    }
    public final String CONST_1 = nonConstant("MASTRONG");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut
    Merci pour la réponse

    Citation Envoyé par thelvin
    Les constantes doivent être là où elles doivent être.
    Je suis d'accord mais dans mon cas, j'avais des constantes réutilisées par plusieurs modules [une trentaine] donc je trouvais logique de les "externaliser" pour éviter les incohérences.

    Je vais utiliser le principe de la méthode pour gérer cela.

Discussions similaires

  1. [Compilation]Compilateur Java
    Par gurv4n dans le forum Général Java
    Réponses: 4
    Dernier message: 09/01/2008, 21h31
  2. Compilateur Java sous Mandriva 2006
    Par Myra67 dans le forum Applications et environnements graphiques
    Réponses: 11
    Dernier message: 10/06/2006, 15h19
  3. Questions sur les compilateurs java
    Par irenee dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 30/05/2006, 10h42
  4. [Compilateur]compilateur java sous debian
    Par Burinho dans le forum Général Java
    Réponses: 23
    Dernier message: 03/11/2005, 20h54
  5. Compilateurs Java
    Par anzar dans le forum Build
    Réponses: 2
    Dernier message: 12/06/2003, 22h13

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