Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 4)

javathread.jpeg

Motif immuable

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.

Section personnage

** 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.

Quand utiliser

--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.

classe mutable et classe immuatble

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.

Pour protéger l'immuabilité

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

Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 10)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 7)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 3)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 6)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 4)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5)
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 multi-thread)» (Partie 1)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 11)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 12)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 8)
[Java] Résumé des modèles de conception
Un examen rapide de Java appris en classe part4
Résumé des bases du langage Java
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Modèles de conception Java
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Un examen rapide de Java appris en classe
Résumé de ce que j'ai appris dans Spring Batch
Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données
[Java] Résumé de base de Java non couvert par Progate ~ Partie 1 ~
Ce que j'ai appris en Java (partie 3) Déclaration d'exécution des instructions
Résumé de la mise en œuvre des arguments par défaut en Java
Résumé du support Java 2018
Résumé du modèle de conception Java
Ce que j'ai appris en Java (partie 4) Branchement conditionnel et répétition
[Java] Résumé de base de Java non couvert par Progate ~ Partie 2 ・ Liste ~
Road to Java Engineer Part2 Quel type de langage est Java?
[Java11] Résumé du flux -Avantages du flux-
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
Résumé de la classe Java Math
[Java] Résumé de la syntaxe de contrôle
Implémentation Java de tri-tree
Résumé du traitement des erreurs Java
[Java] Résumé des opérations mathématiques
Ce que j'ai appris en Java (partie 1) Flux de développement Java et présentation
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
[Pour les débutants] Résumé du constructeur java
Résumé du package [Java Silver Study]
Utilisation de base de Java Facultatif Partie 1
processus thread-safe en java
Résumé de l'algorithme AtCoder 400 points (édition Java)
Liste des membres ajoutés dans Java 9
Faire une analyse de phrase en Java 8 (partie 2)
Liste des types ajoutés dans Java 9
Résumé de la programmation orientée objet utilisant Java
Implémentation d'une fonction similaire en Java
Création d'une analyse de phrase dans Java 8 (partie 1)