Java Language Piège: ne pas comprendre que String est une classe immuable


Exemple

Les nouveaux programmeurs Java oublient souvent, ou échouent à comprendre, que la classe Java String est immuable. Cela conduit à des problèmes comme celui de l'exemple suivant:

public class Shout {
    public static void main(String[] args) {
        for (String s : args) {
            s.toUpperCase();
            System.out.print(s);
            System.out.print(" ");
        }
        System.out.println();
    }
}

Le code ci-dessus est censé imprimer les arguments de ligne de commande en majuscule. Malheureusement, cela ne fonctionne pas, la casse des arguments n'est pas modifiée. Le problème est cette déclaration:

s.toUpperCase();

Vous pourriez penser que l’appel à toUpperCase() va changer s en une chaîne majuscule. Ce n'est pas le cas. Ça ne peut pas! String objets String sont immuables. Ils ne peuvent pas être changés.

En réalité, la méthode toUpperCase() renvoie un objet String qui est une version majuscule de la String laquelle vous l'appelez. Ce sera probablement un nouvel objet String , mais si s était déjà en majuscule, le résultat pourrait être la chaîne existante.

Donc, pour utiliser cette méthode efficacement, vous devez utiliser l'objet renvoyé par l'appel de la méthode. par exemple:

s = s.toUpperCase();

En fait, la règle "strings never change" s'applique à toutes les méthodes String . Si vous vous en souvenez, vous pouvez éviter toute une catégorie d'erreurs du débutant.