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 :

private static final String vs inline


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Points : 115
    Points
    115
    Par défaut private static final String vs inline
    Bonjour à tous,

    J'ai une question au sujet du comportement mémoire de la JVM sur deux utilisations de String.
    Entre les deux bouts de code suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private static final String CONSTANT_NAME = "untel";
     
    (...)
     
    if (var.equalsIgnoreCase(CONSTANT_NAME)) {
    (...)
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (var.equalsIgnoreCase("untel")) {
    (...)
    }
    Y en a t'il un qui est plus performant que l'autre ? Comment se passe la gestion de ces deux String en mémoire ? Il me semble qu'elles devraient toutes les deux arriver dans le même pool de String, mais du coup, je n'arrive pas à voir si le comportement à l'éxécution est le même ou pas.

    J'ai fait un tour du côté du forum de Sun, mais je n'ai pas trouvé la réponse à cette question (d'où la ressemblance au sujet http://forum.java.sun.com/thread.jsp...5686&tstart=60 )

    Merci d'avance

    Reeter

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Un string est considéré comme constant s'il est défini avec des guillemets ou s'il est défini avec les mot clé final static. S'il est constant, alors une seule instance du string existe en mémoire, il est écrit en dur dans le bytecode.

    Exemple :
    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
    public class A {
      public static final String MON_STRING = "mon_string";
    }
     
    public class B {
      public static final String MON_AUTRE_STRING = "mon_string";
    }
     
    public class Main {
      public static void main (String... args) {
        String a = A.MON_STRING.substring(0); // a = "mon_string", mais a est une instance créée au runtime et non à la compilation, donc ce n'est pas la même instance.
        System.out.println(A.MON_STRING == B.MON_AUTRE_STRING); // true
        System.out.println(a == A.MON_STRING); // false;
      }
    }
    Dans l'exemple que tu donnes, aucun n'est plus optimisé que l'autre, tous deux donneront le même bytecode (à l'exception de la constante CONSTANT_NAME qui existe dans l'un et pas dans l'autre).

  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,


    Dans ce cas précis les deux codes sont équivalents, puisque CONSTANT_NAME est une "variable constante". C'est à dire un attribut static final auquel on assigne une expression constante évaluable à la compilation.

    Le compilateur remplace ainsi toutes les occurrences de CONSTANT_NAME par sa valeur lors de la compilation.


    Plus d'info : Qu'est-ce qu'une constante ?

    a++

    PS à noter que c'est également le cas pour les variables locales finales.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Points : 115
    Points
    115
    Par défaut
    OK.

    Par conséquent, si j'ai, dans plusieurs objets, un appel à une fonction du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var.setName("lenom");
    Ca ne sert à rien (au niveau des perfs) de déclarer une static final string dans un coin pour l'utiliser de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var.setName(CONSTANT_NAME);

    Je ne parle qu'au niveau des performances.

    C'est bien ça ?



    EDIT: Passé en résolu suite à la seconde réponse.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Au niveau des perfs, non. Au niveau sémantique, il est toujours préférable d'utiliser les constantes

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Je me suis posé la même question... mais pas tout a fait de la même manière:

    quel est la différence entre:
    1) methodTraitanLesString("mon_string");
    et
    2 ) public static final char MON_STRING[] = "mon_string";
    et
    3) public static final String MON_STRING = "mon_string";

    J'ai un peu tourné en rond avant de trouver une...

    Réponse:
    1) le compilateur associe un numero d'entrée dans le constant pool à la string qui sera référencé par ce numéro si elle est utilisé plusieurs fois. Donc c'est la solution qui consome le moins de mémoire (fichier.class tout comme JVM RAM)

    2) Le compilateur associe deux string dans le constant pool: "MON_STRING" et "mon_string". A l'initialisation de la class, "MON_STRING" sera chargé ainsi que "mon_string". Donc une memoire consommée plus grande fichier.class tout comme JVM RAM)

    3) pareil que en 2 sauf que "mon_string" est alors un objet de type String qui contiens un tableau de char.

    NB: la plus part des JVM on des tables de hachage. Donc toute déclaration du type 2) ou 3) engendre un traitement supplémentaire, le temps de ranger la donnée dans la table de hachage.

    Conclusion: Pour une optimisation de tout type de mémoire et de temps CPU, ne créez pas de fields avec un nom.
    Par contre niveau relecture de code, c'est vachement plus propore.
    Et comme le java est un langage qui a été créé dans un but de faciliter la vie du programmeur tout en perdant de la capacité mémoire et du temps de calcul... Alors arrêtez de vous prendre le choux, et pensez à quand vous vous relirez: utilisez des final string.

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

Discussions similaires

  1. Protection d'un tableau public static final
    Par sachem dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 07/02/2009, 21h20
  2. static final serialVersionUID
    Par MiXinG dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 22/03/2008, 11h03
  3. Réponses: 6
    Dernier message: 22/11/2007, 19h46
  4. differences static final - private protected
    Par fantomas261 dans le forum Langage
    Réponses: 2
    Dernier message: 27/05/2007, 12h24
  5. Modification d'un attribut static final
    Par n@n¤u dans le forum Langage
    Réponses: 8
    Dernier message: 19/06/2006, 17h19

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