27 votes

Quand utiliser intern () sur les littéraux de chaîne

Je vois beaucoup de code hérité comme celui-ci:

 class A {
    public static final String CONSTANT = "value".intern();
    ...
}
 

Je ne vois aucune raison pour l'intern (), comme dans le Javadoc on peut lire: "Toutes les chaînes littérales et les expressions constantes à valeur de chaîne sont internées." Y a-t-il une intention, peut-être dans les révisions antérieures du langage?

55voto

kdgregory Points 21849

C'est une technique pour s'assurer que CONSTANT n'est pas réellement une constante.

Lorsque le compilateur Java voit une référence à un final statique primitive ou de la Ficelle, il insère la valeur réelle de la constante dans la classe qui l'utilise. Si vous modifiez la valeur de la constante dans la définition de la classe mais ne pas recompiler l'aide de la classe, il va continuer à utiliser l'ancienne valeur.

En appelant stagiaire() sur la "constante" de la chaîne, il n'est plus considéré comme une constante statique par le compilateur, de sorte que l'utilisation de la classe sera effectivement accéder à la définition de la classe de membre à chaque utilisation.


JLS citations:

14voto

pjp Points 7012

L'utilisation de l' intern() avec la constante chaîne de caractères littérale est une perte de temps, comme le littéral sera déjà interné comme spécifié par l'article 3.10.5 de l' [JLS][1].

Je suppose que le programmeur n'a pas à apprécier ce fait.

*Edit:**

Comme kdgregory l'a souligné il y a un impact sur la façon dont cette constante peut être insérée.

[1]- http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#101083

4voto

TofuBeer Points 32441

Il y a un moment j'stagiaire()ed toutes les Chaînes provenant de fichiers de classe (pour un classfile de l'analyseur). Stagiaire()ing fait le programme d'utiliser moins de mémoire (ne sera pas, dans ce cas, comme d'autres l'ont fait remarquer), mais il a ralenti le programme nettement à la baisse (je pense qu'il a pris 4 secondes pour analyser tous rt.jar et qui changer la mettre plus de 8 secondes). La recherche en elle à la fois (a JDK 1.4 je crois) le stagiaire() le code est assez moche et plus lent que dans probablement besoin de l'être.

Si je devais envisager de demander stagiaire() dans mon code, je voudrais d'abord de profil sans stagiaire() puis de profil, avec le stagiaire() pour à la fois la mémoire et la vitesse, et de voir celui qui est "pire" pour le changement.

0voto

Ustaman Sangat Points 757

J'ai utilisé stagiaire() pour "verrouillage". Par exemple, disons que j'ai un "référentiel" de "les registres du commerce". Alors que j'ai modifier et mettre à jour un commerce, je veux verrouiller le commerce; je pourrais à la place de verrouillage sur le tradeId.stagiaire (), de sorte que je n'ai pas à vous soucier de clones d'un commerce flottant autour. Je ne sais pas si tout le monde aime cette utilisation.

Cela suppose que le champ id est peu probable accidentellement en collision avec le champ d'identifiant d'un autre domaine, l'objet d'une tradeId n'arrive pas à entrer en collision avec account_number, par exemple, où l'on peut également faire

synchronized(account.getAccountNumber().intern()) {...}

voir exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X