Si bien es cierto que Collections.unmodifiableList()
funciona, a veces puede tener una gran biblioteca con métodos ya definidos para devolver matrices (por ejemplo, String[]
). Para evitar romperlos, en realidad se puede definir matrices auxiliares que almacenarán los valores:
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;
}
}
Para probar:
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()));
No es perfecto, pero al menos tienen "pseudo matrices inmutables" (de la perspectiva de clase) y esto no romperá el código relacionado.
Hágase un favor y parada utilizando matrices de Java para nada, además de 1) io 2) Número pesado crujido 3) si es necesario poner en práctica su propia lista/Collection (que es raro * *). Son extremadamente inflexibles y anticuados ... como acabas de descubrir con esta pregunta. – whaley
@Whaley, y actuaciones, y código en el que no necesita arreglos "dinámicos". Las matrices siguen siendo útiles en muchos lugares, no es tan raro. –
@ Colin: sí, pero son severamente restrictivas; lo mejor es acostumbrarse a pensar "¿realmente necesito una matriz aquí o puedo usar una lista?" –