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 :

Problèmes avec les variables final


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Problèmes avec les variables final
    Bonjour à tous...

    Je développe est java depuis bientôt deux ans, et récemment, j'ai été confronté à un petit problème du style "effet de bord" qui énerve assez.
    J'ai identifié le problème qui vient apparamment du compilo qui ferait des optimisations parfois inconvenantes... Pour mieux comprendre je vous expose le problème par deux petites sources et je vous détaille le tout.

    Il faut créer un premier paquetage que l'on appelera "librairie" et qui contient une classe Lib décrite comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package librairie;
     
    public class Lib{
       public final static String CONSTANTE = "Ma constante";
     
       public static void methode(String arg) {
          System.out.println("librairie.Lib.methode: arg = "+arg);
          System.out.println("librairie.Lib.methode: CONSTANTE = "+CONSTANTE);
       }
    }
    Ensuite vous créez un second paquetage appelé "application" qui contient la classe Application décrite ci après:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package application;
     
    import librairie.Lib;
     
    public class Application {
       public static void main(String args[]) {
          System.out.println("application.Application: Lib.CONSTANTE = "+Lib.CONSTANTE);
          System.out.println("application.Application: Appel de la méthode de la librairie.\n");
          Lib.methode(Lib.CONSTANTE);
          System.out.println("\napplication.Application: Fin");
       }
    }
    Vous compilez le tout et tout marche comme prévu...

    Maintenant, imaginez que vous voulez modifier la constante CONSTANTE dans la librairie: vous modifier le code de Lib.java et vous affectez "Ma nouvelle constante" à la variable constante... Cependant, vous ne recompilez que le paquetage librairie parce que vous pensez que la modification va être impactée sur l'application...
    Ben non!!!
    Relancez application.Application après n'avoir recompilé que la librairie et une chose bien étrange vous surprendra...

    Apparemment, le compilo transfère toutes les constantes dans les classes qui les utilisent pour optimiser le code. Actuellement, les moyens de s'en sortir sont de ne pas déclarer ces constantes en véritables constantes (supprimer final ), ou de faire un accès aux valeurs par des méthodes: ce qui n'est pas très optimal !!! Un autre moyen serait de gérer les sources java par un makefile comme pour le C et le C++: mais on perd en souplesse !!!

    : : :
    Alors la question que je pose c'est la suivante: existe-t-il une option de compilation ou une classe de mémorisation qui permette d'obtenir le résultat voulu sans trop dégrader les performances du code et sans ajouter trop de contrainte?
    : : :

    Ceci est quand même assez remarquable. Imaginez que vous fournissez une librairie d'objets java qui contiennent des constantes publiques. Votre client compile une première fois son application avec vos classes et tout marche très bien. Quelques temps après vous livrez une nouvelle version de votre librairie. Votre client l'installe, mais ne recompile pas son application parce que vous lui avez indiqué que les modifications ne nécessitent pas de recompilation... Et là, pof, plus rien ne marche!!!

    Merci à tous ceux et à toutes celles qui pourront m'éclairer sur le sujet!!!


    A bientôt

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    Le théorie des compilateurs et des linkers, ça t'évoque quelque-chose? ;-)
    l'import ne se fait pas à l'exécution, mais à la compilation.
    Si tu veux pouvoir changer ta constante (qui du coup, devient une variable, non?), pourquoi ne pas utiliser un fichier de properties?

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    En effet, il s'agit d'une optimization du compilateur. Il considère qu'une constante ne devrait pas être modifié...
    si il s'agit de paramètres de l'application, je pense comme Marc_P qu'il vaut mieux utiliser un fichier de configuration (properties, XML ou autres...)

    Mais il existe quand même une solution pour éviter que le compilateur n'effectue l'optimization : il ne faut pas définir la valeur avec l'opérateur egal mais dans un bloc static{}.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Lib{
    	public final static String CONSTANTE;
    	public final static String CONSTANTE2;
     
    	static {
    		CONSTANTE = "Ma Constante";
    		CONSTANTE2 = "Ma Constante 2";
    	}
     
    	/*...*/
    }
    Par contre je ne sais pas si c'est mieux ou pas que l'utilisation de méthode getter...

    Les variables static final ne seront plus remplacées par leurs valeurs à la compilation...
    Il faut bien sûr recompiler le tout au moins une fois après la modif...

    a++

  4. #4
    Membre régulier Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Points : 96
    Points
    96
    Par défaut
    Par rapport à la méthode getter, en termes de performances tu gagnes un appel de fonction.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour vos tuyaux...

    En ce qui concerne le fichier de properties, la méthode n'est pas acceptable puisque ces derniers sont facilement accessibles aux utilisateurs peu scrupuleux...

    Merci à adiGuba pour son astuce sur l'initialisation par blocks, je crois que dans un premier temps c'est ce que je vais faire!!!

    En tous les cas, ce forum est très efficaces!

    I'll be back

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    c'est peut-être bête comme idée, mais peut-être que cela ne réagit pas pareil en utilisant des interfaces pour les constantes ? as-tu essayé ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Non, j'ai pas testé le coup des interfaces...
    Je vais m'y attacher... Mais je ne vois pas pourquoi le compilo ne ferait pas le même type d'optimisation...

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par casolaro
    Mais je ne vois pas pourquoi le compilo ne ferait pas le même type d'optimisation...
    moi non plus, mais on sait jamais...

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

Discussions similaires

  1. problème avec les variables de la méthode GET
    Par will97 dans le forum Langage
    Réponses: 11
    Dernier message: 11/12/2007, 14h43
  2. Réponses: 8
    Dernier message: 20/06/2006, 16h25
  3. Problème avec les variables en PHP
    Par King_T dans le forum Langage
    Réponses: 3
    Dernier message: 06/05/2006, 23h46
  4. Problèmes avec les variables et les unités
    Par christoufe dans le forum EDI
    Réponses: 2
    Dernier message: 22/01/2006, 16h22
  5. Réponses: 6
    Dernier message: 28/05/2004, 09h39

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