2013-06-15 2 views
9

В поисках этой цели, нашел много кода. Но любой из них дал мне то, что я хочу. Я хочу сделать обычный массив неизменным. Я попытался это:Есть ли способ сделать обычный массив неизменным в Java?

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]); 

    } 
} 

Но он не работает, я могу назначить 5 в массив [0] ... Есть ли способ, чтобы сделать этот массив неизменны?

+1

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

+3

В отличие от C вы не можете. Однако вы можете использовать обертку. – johnchen902

+3

Создание окончательной переменной массива предотвращает присвоение ему нового массива. Насколько я знаю, нет способа сделать его окончательным. –

ответ

5

Если вы хотите, чтобы использовал его в качестве массива, вы не можете.

Вы должны создать оболочку для него, так что вы бросаете исключение на, скажем, .set(), но никакое количество обтекание не позволит вам бросить исключение на:

array[0] = somethingElse; 

Конечно, неизменность элементов - это совсем другое дело!

ПРИМЕЧАНИЕ: стандартное исключение для выдачи для неподдерживаемых операций точно названо UnsupportedOperationException; поскольку он не установлен, вам не нужно объявлять его в предложении throws вашего метода.

3

Это невозможно с примитивными массивами.

Вам необходимо использовать Collections.unmodifiableList(), как вы уже делали в своем коде.

1

Вы также можете использовать Guava's ImmutableList, высокоэффективную, неизменяемую реализацию списка случайного доступа, которая не допускает нулевые элементы. В отличие от Collections.unmodifiableList(java.util.List), который представляет собой просмотр отдельной коллекции, которая все еще может быть изменена, экземпляр ImmutableList содержит свои личные данные и никогда не изменится.

+0

Однако OP говорит, что« конечный результат »не должен быть« Collection ». В противном случае, да, «неумолимый» рок Гуавы. – fge

Смежные вопросы