Chociaż prawdą jest, że działa Collections.unmodifiableList()
, czasami może istnieć duża biblioteka, która ma już zdefiniowane metody zwracania tablic (na przykład String[]
). Aby zapobiec ich łamanie, rzeczywiście można określić pomocnicze tablice, które będą przechowywać wartości:
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;
}
}
do testu:
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()));
Nie idealne, ale przynajmniej masz „pseudo niezmienne tablic” (z perspektywa klasowa) i nie złamie to powiązanego kodu.
Zrób sobie przysługę i zatrzymać za pomocą tablic w Javie na wszystko oprócz 1) io 2) liczba ciężkich pożerające 3) Jeśli trzeba zaimplementować własną listę/zbiór (co jest rzadkością * *). Są niezwykle nieelastyczne i przestarzałe ... jak właśnie odkryłeś to pytanie. – whaley
@Whaley, a wydajność i kod, w którym nie potrzebujesz "dynamicznych" tablic. Tablice są nadal przydatne w wielu miejscach, nie jest to rzadkością. –
@Colin: tak, ale są poważnie ograniczające; najlepiej jest wejść w nawyk myślenia "czy naprawdę potrzebuję tutaj tablicy lub czy mogę zamiast tego użyć listy?" –