Java Language Création d'une version immuable d'un type utilisant la copie défensive.


Exemple

Certains types et classes de base en Java sont fondamentalement mutables. Par exemple, tous les types de tableau sont modifiables, tout comme les classes java.util.Data . Cela peut être gênant dans les situations où un type immuable est obligatoire.

Une façon de gérer cela est de créer un wrapper immuable pour le type mutable. Voici un wrapper simple pour un tableau d'entiers

public class ImmutableIntArray {
    private final int[] array;
    
    public ImmutableIntArray(int[] array) {
        this.array = array.clone();
    }

    public int[] getValue() {
        return this.clone();
    }
}

Cette classe fonctionne en utilisant la copie défensive pour isoler l'état mutable (l' int[] ) de tout code qui pourrait le muter:

  • Le constructeur utilise clone() pour créer une copie distincte du tableau de paramètres. Si l'appelant du constructeur suivant modifiait le tableau de paramètres, cela n'affecterait pas l'état de la ImmutableIntArray .

  • La méthode getValue() utilise également clone() pour créer le tableau renvoyé. Si l'appelant changeait le tableau de résultats, cela n'affecterait pas l'état du tableau ImmutableIntArray .

Nous pourrions également ajouter des méthodes à ImmutableIntArray pour effectuer des opérations en lecture seule sur le tableau encapsulé; par exemple, obtenir sa longueur, obtenir la valeur à un index particulier, etc.

Notez qu'un type de wrapper immuable implémenté de cette manière n'est pas compatible avec le type d'origine. Vous ne pouvez pas simplement substituer le premier au second.