171 votes

Tableau immuable en Java

Existe-t-il une alternative immuable aux tableaux primitifs en Java ? Création d'un tableau primitif final n'empêche pas réellement de faire quelque chose comme

final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;

Je veux que les éléments du tableau soient immuables.

0voto

miguelt Points 71

S'il est vrai que Collections.unmodifiableList() fonctionne, parfois vous pouvez avoir une grande bibliothèque ayant des méthodes déjà définies pour retourner des tableaux (par ex. String[] ). Pour éviter de les casser, vous pouvez en fait définir des tableaux auxiliaires qui stockeront les valeurs :

public class Test {
    private final String[] original;
    private final String[] auxiliary;
    /** constructor */
    public Test(String[] _values) {
        original = new String[_values.length];
        // Pre-allocated array.
        auxiliary = new String[_values.length];
        System.arraycopy(_values, 0, original, 0, _values.length);
    }
    /** Get array values. */
    public String[] getValues() {
        // No need to call clone() - we pre-allocated auxiliary.
        System.arraycopy(original, 0, auxiliary, 0, original.length);
        return auxiliary;
    }
}

A tester :

    Test test = new Test(new String[]{"a", "b", "C"});
    System.out.println(Arrays.asList(test.getValues()));
    String[] values = test.getValues();
    values[0] = "foobar";
    // At this point, "foobar" exist in "auxiliary" but since we are 
    // copying "original" to "auxiliary" for each call, the next line
    // will print the original values "a", "b", "c".
    System.out.println(Arrays.asList(test.getValues()));

Ce n'est pas parfait, mais au moins vous avez des "tableaux pseudo-immuables" (du point de vue de la classe) et cela ne cassera pas le code connexe.

-2voto

Martin Points 31

Eh bien les tableaux sont utiles pour passer comme constantes (s'ils l'étaient) comme paramètres de variantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X