C'est un bon article qui expose les deux raisons déjà mentionnées dans les réponses ci-dessus :
-
Sécurité : le système peut distribuer d'informations sensibles en lecture seule sans craindre que qu'elles soient modifiées
-
Performance Les données immuables sont très utile pour rendre les choses sûres pour les fils.
Et c'est probablement le commentaire le plus détaillé de cet article. Il concerne le pool de chaînes de caractères en Java et les questions de sécurité. Il s'agit de savoir comment décider ce qui va dans le pool de chaînes. En supposant que les deux chaînes sont égales si leur séquence de caractères est la même, nous avons alors une condition de course sur qui arrive en premier et avec cela des problèmes de sécurité. Si ce n'est pas le cas, le pool de chaînes de caractères contiendra des chaînes redondantes, perdant ainsi l'avantage de l'avoir en premier lieu. Lisez-le vous-même, voulez-vous ?
L'extension de la chaîne de caractères perturberait les égaux et les internes. JavaDoc dit equals :
Compare cette chaîne à l'objet spécifié. Le résultat est vrai si et seulement si l'argument n'est pas nul et est un objet String qui représente la même séquence de caractères que cet objet.
En supposant que java.lang.String
n'était pas définitif, un SafeString
pourrait correspondre à un String
et vice versa, car ils représentent la même séquence de caractères.
Que se passerait-il si vous appliquiez intern
à un SafeString
-- est-ce que le SafeString
dans le pool de chaînes de la JVM ? Le site ClassLoader
et tous les objets que le SafeString
détenait des références serait alors verrouillé en place pour la durée de vie de la JVM. On obtiendrait une condition de course pour savoir qui serait le premier à internaliser une séquence de caractères -- peut-être que votre SafeString
gagnerait, peut-être un String
ou peut-être un SafeString
chargé par un classloader différent (donc une classe différente).
Si vous gagnez la course à la piscine, il s'agirait d'un véritable singleton et les gens pourraient accéder à l'ensemble de votre environnement (bac à sable) par le biais de la réflexion et de la fonction secretKey.intern().getClass().getClassLoader()
.
La JVM pourrait aussi bloquer ce trou en s'assurant que seuls des objets String concrets (et aucune sous-classe) sont ajoutés au pool.
Si les égaux étaient mis en œuvre de telle sorte que SafeString
!= String
puis SafeString.intern
!= String.intern
y SafeString
devrait être ajouté à la réserve. La réserve deviendrait alors une réserve de <Class, String>
au lieu de <String>
et tout ce dont vous auriez besoin pour entrer dans la piscine serait un nouveau chargeur de classe.
0 votes
Merci à tous pour vos réponses, en particulier à TrueWill, Bruno Reis et Thilo ! J'aimerais pouvoir choisir plus d'une réponse comme étant la meilleure, mais malheureusement... !
1 votes
Considérez également la prolifération de projets "Oh, j'ai juste besoin de quelques méthodes utilitaires supplémentaires sur String" qui apparaîtraient - tous ne pourraient pas utiliser les Strings des autres parce qu'ils sont d'une classe différente.
0 votes
Merci pour cette réponse très utile. Nous avons deux faits maintenant. Une chaîne est une classe finale et est immuable parce qu'elle ne peut pas être changée mais peut être référencée à un autre objet. Mais qu'en est-il de : String a = new String("test1") ; then, s = "test2" ; Si String est un objet de classe finale alors comment peut-il être modifié ? Comment puis-je utiliser un objet final modifié ? S'il vous plaît laissez-moi si j'ai mal demandé quelque chose.
0 votes
Vous pouvez consulter ce bon article .
4 votes
Une chose que nous avons heureusement évitée en Java est le "tout le monde a sa propre sous-classe de String avec beaucoup de méthodes supplémentaires, et aucune d'entre elles n'est compatible avec les autres".
0 votes
Meilleur lien javarevisited.blogspot.com/2010/10/
0 votes
@Premraj, merci pour votre référence au lien. Mais après avoir lu cet article en profondeur, il semble qu'immuable et Final soient exactement les mêmes. Ma question est la suivante : immuable et Final sont-ils une seule et même chose ? Si ce n'est pas le cas, le lien mentionné n'explique pas de manière explicite pourquoi String est Final.