La classe String ne fournit pas de méthode pour modifier le contenu d'une chaîne. Le contenu de la chaîne représentée par l'instance String ne change jamais. Pour cette raison, les méthodes de la classe String n'ont pas besoin d'être synchronisées. ** Immuable ** signifie «immuable» ou «inchangé». Dans le modèle Immuable, une classe (** classe immuable **) qui garantit que l'état de l'instance ne change pas apparaît. Puisque le contrôle exclusif n'est pas requis, une amélioration des performances peut être attendue si elle est bien utilisée.
(Voir ce manuel pour le code complet)
public final class Person {
private final String name;
private final String hobby;
public Person(String name, String hobby) {
this.name = name;
this.hobby = hobby;
}
public String getName() {
return name;
}
public String getHobby() {
return hobby;
}
}
Dans cette classe, la valeur du champ de la classe Person ne peut être définie que dans le constructeur. Il n'existe pas non plus de méthode pour modifier la valeur du champ. Par conséquent, une fois qu'une instance de la classe Person est créée, la valeur du champ ne change pas. À ce stade, la classe Person est sûre même si elle est accessible à partir de plusieurs threads en même temps. Aucune des deux méthodes n'a besoin d'être synchronisée.
** Rôle immuable ** apparaît. Le rôle Immuable est une classe qui ne peut pas modifier la valeur d'un champ et n'a pas de méthode pour modifier le contenu du champ.
--Lorsque l'état ne change pas après la création de l'instance. C'est la fois suivante. ** Le champ est définitif, la méthode setter n'existe pas et l'instance référencée par le champ ne change pas **.
Notez que les classes suivantes ne sont pas immuables.
public final class Hoge {
private final StringBuffer hoge;
public Hoge(String a, String b) {
this.hoge = new StringBuffer("a=" + a + ", b=" + b);
}
public StringBuffer getHoge() {
return hoge;
}
}
L'instance que possède le champ hoge obtenu par la méthode getHoge n'est pas une chaîne mais une instance de StringBuffer. Étant donné que la classe StringBuffer a une méthode pour modifier l'état interne, le contenu du champ hoge peut être réécrit de l'extérieur. Puisque le champ hoge est déclaré final, la valeur du champ lui-même ne change pas, mais l'état de l'instance vers laquelle pointe le champ (pensez-y comme un pointeur) peut changer.
--Lorsque l'instance est partagée et fréquemment consultée.
Certaines bibliothèques de classes standard Java ont une paire de classes mutables et immuables. Par exemple, les classes StringBuffer et String. StringBuffer est correctement synchronisé lors de la réécriture. D'autre part, la classe String n'utilise pas Synchronized, donc une référence rapide est possible. Utilisez StringBuffer si vous souhaitez modifier le contenu fréquemment et utilisez String si vous n'avez pas besoin de modifier le contenu et de simplement y faire référence.
Si synchronized est supprimé en supposant qu'il s'agit d'un modèle Immuable, la sécurité de la classe sera perdue dès que l'immuabilité est perdue. Par conséquent, l'immuabilité doit être clairement indiquée dans les commentaires du programme et la documentation de l'API.
Relation Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 1) Résumé de "Modèles de conception appris en langage Java (édition multithread)" (Partie 2) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 3)
Recommended Posts