2013-06-15 16 views
9

Zatroszczyłem się o nią, znalazłem mnóstwo kodu. Ale każdy z nich dał mi to, czego chcę. Chcę zrobić zwykłą tablicę Niezmienną. Próbowałem to:Czy istnieje sposób na uniezależnienie od zwykłej tablicy w Javie?

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class test { 

    public static void main(String[] args) { 

     final Integer array[]; 

     List<Integer> temp = new ArrayList<Integer>(); 
     temp.add(Integer.valueOf(0)); 
     temp.add(Integer.valueOf(2)); 
     temp.add(Integer.valueOf(3)); 
     temp.add(Integer.valueOf(4)); 
     List<Integer> immutable = Collections.unmodifiableList(temp); 

     array = immutable.toArray(new Integer[immutable.size()]); 

     for(int i=0; i<array.length; i++) 
      System.out.println(array[i]); 

     array[0] = 5; 

     for(int i=0; i<array.length; i++) 
      System.out.println(array[i]); 

    } 
} 

Ale to nie robi pracy, można przypisać 5 do tablicy [0] ... Czy istnieje jakiś sposób, aby ta tablica niezmienne?

+1

http://stackoverflow.com/questions/3700971/immutable-array-in-java –

+3

W przeciwieństwie do C, nie można. Możesz jednak użyć opakowania. – johnchen902

+3

Dokonanie ostatecznej zmiennej w tablicy zapobiega tylko przypisaniu do niej nowej tablicy. O ile wiem, nie ma sposobu na ostateczne wartości. –

Odpowiedz

5

Jeśli chcesz użyj go jako tablicy, nie możesz.

Musisz utworzyć opakowanie dla niego, tak że wyjątek na, powiedzmy, .set(), ale żadna ilość owijania wokół pozwoli Ci wyjątek na:

array[0] = somethingElse; 

Oczywiście, niezmienność elementów to zupełnie inna sprawa!

UWAGA: średnia wyjątkiem wyrzucić do operacji niepodpartych trafnie nazwie UnsupportedOperationException; ponieważ nie jest zaznaczone, nie musisz deklarować go w klauzuli throws swojej metody.

3

Jest to niemożliwe w prymitywnych tablicach.

Będziesz musiał użyć Collections.unmodifiableList(), tak jak już zrobiłeś w swoim kodzie.

1

Można również użyć Guava's ImmutableList, wysoce wydajnej, niezmiennej implementacji listy dostępu swobodnego, która nie dopuszcza elementów zerowych. W przeciwieństwie do Collections.unmodifiableList(java.util.List), który jest widokiem oddzielnej kolekcji, która wciąż może się zmienić, instancja ImmutableList zawiera własne prywatne dane i nigdy się nie zmieni.

+0

Jednak OP mówi, że" wynik końcowy "nie może być zbiorem" kolekcji ". W przeciwnym razie, tak, Guava jest niezmienna. – fge

Powiązane problemy