Objets immuables — ce sont des objets dont l'état ne peut pas être modifié après leur création. Leurs principales caractéristiques :
Avantages des objets immuables :
Exemple d'implémentation d'une classe immuable :
public final class Person { private final String name; private final int age; private final List<String> phones; public Person(String name, int age, List<String> phones) { this.name = name; this.age = age; // Protection contre la mutation de la liste transmise this.phones = Collections.unmodifiableList(new ArrayList<>(phones)); } public String getName() { return name; } public int getAge() { return age; } public List<String> getPhones() { return phones; } // Retourne une liste en lecture seule }
Pourquoi
Stringest immuable en Java et que se passerait-il si ce n'était pas le cas ? Beaucoup de gens répondent "pour la sécurité", mais que cela signifie-t-il dans la pratique ?
Réponse :
String est utilisé dans de nombreux endroits : comme clés dans des collections, dans la logique de sécurité (par exemple, les mots de passe). Si une chaîne pouvait être modifiée via une référence, cela affecterait toutes les autres références au même objet, rendant impossible le bon fonctionnement des collections (par exemple, HashMap — lors du calcul de hashCode) et pouvant conduire à des vulnérabilités de sécurité.
Histoire
Collections.unmodifiableList.Histoire
Date, List) étaient stockés. Dans un des threads, la configuration a été modifiée, tandis que dans un autre, des données obsolètes ou inconsistantes ont été récupérées, ce qui a fait échouer incorrectement un algorithme métier.Histoire
Dans un système de connexion, les mots de passe étaient stockés dans un objet mutable. En raison d'un accès non sécurisé, le mot de passe d'un autre utilisateur a soudainement été "fuit", car la même instance de l'objet était utilisée par plusieurs threads.