UnsupportedOperationException для коллекции - PullRequest
28 голосов
/ 22 мая 2010

При изучении API Collection мы обнаруживаем, что некоторые методы (add, remove, ...) могут выдавать java.lang.UnsupportedOperationException, если текущая реализация Collection не поддерживает эти функции.

Есть ли в JDK конкретный Collection, который не поддерживает эти методы?

Большое спасибо за ваши ответы.

Ответы [ 4 ]

28 голосов
/ 22 мая 2010

Помимо коллекций, возвращаемых методами Collections.unmodifiable*, есть еще пара интересных случаев, когда на самом деле выбрасывается UnsupportedOperationException:

  • коллекционные виды Map, доступ к которым осуществляется через entrySet(), keySet() и values() элементы удалены, но не добавлены,
  • представление списка, возвращаемое Arrays.asList, не может содержать ни элементов, ни добавленных, ни удаленных,
  • Более того, объекты, полученные из методов Collections.empty* и Collections.singleton*, также помечаются как «неизменяемые» , поэтому - хотя это явно не указано в документации API - я полагаю, что эти исключение также при попытках их изменения.
21 голосов
/ 22 мая 2010

Очевидными примерами являются реализации, возвращенные, скажем, Collections.unmodifiableCollection() и другими подобными методами. Методы, которые могли бы изменить Collection, вызывают это исключение.

14 голосов
/ 28 декабря 2012

Обычно при создании списка типа List<String> sample=Collections.emptyList();. Список sample будет создан как Collections.unmodifiableCollection().

  • Таким образом, образец списка не поддерживает операции с динамическим списком. Вы можете только назначить другой список этому списку, используя оператор присваивания. Например>

    List<String> ls=new ArrayList<String>();
    ls.add("one");
    ls.add("Three");
    ls.add("two");
    ls.add("four"); 
    sample = ls;
    
  • Для операций с динамическим списком у вас должен быть такой синтаксис List<String> sample= new ArrayList<String>();. В этом списке вы можете выполнить sample.add(), sample.addAll() и т.д ...

4 голосов
/ 22 мая 2010

Да. Например, когда вы звоните Collections.unmodifiableList(list), возвращаемый список не поддерживает add(..)

Однако эти коллекции в основном являются частными классами, которые не предоставляют API, поэтому вы не можете их создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...