Lista Java UnsupportedOperationException
1. Visão geral
Neste tutorial rápido, discutiremos umException comum que pode ocorrer ao trabalhar com algumas das APIs da maioria das implementações deList - oUnsupportedOperationException.
Umjava.util.List tem mais funcionalidade do que umrray comum pode suportar. Por exemplo, com apenas uma chamada de método integrada, é possível verificar se um elemento específico está dentro da estrutura. É normalmente por isso que às vezes precisamos converter umarray em umList ouCollection.
Para obter uma introdução à implementação principal do JavaList - oArrayList - consulteto this article.
2. UnsupportedOperationException
Uma forma frequente em que esse erro ocorre é quando usamos o métodoasList() dejava.util.Arrays:
public static List asList(T... a)
Retorna:
-
um tamanho fixoList a partir do tamanho de um determinadoarray
-
um elemento do mesmo tipo que o doarray original e deve ser umObject
-
elementos na mesma ordem as na matriz original
-
uma lista que éserializablee implementaRandomAccess
Como T é umvarargs, podemos passar um array ou os itens diretamente como parâmetros, e o método criará uma lista inicializada de tamanho fixo:
List flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
Também podemos passar umarray real:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);
Since the returned List is a fixed-size List, we can’t add/remove elements.
Uma tentativa de adicionar mais elementos causariaUnsupportedOperationException:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);
flowerList.add("Celosia");
A raiz desseException é que o objeto retornado não implementa a operaçãoadd() , pois não é o mesmo quejava.util.ArrayList.
É umArrayList, dejava.util.Arrays.
Outra maneira de obter a mesma exceção é tentando remover um elemento da lista obtida.
Por outro lado, existem maneiras de obter umList mutável caso seja necessário.
Um deles é criar umArrayList ou qualquer tipo de lista diretamente do resultado deasList():
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = new ArrayList<>(Arrays.asList(flowers));
3. Conclusão
Em conclusão, é importante entender que adicionar mais elementos a uma lista pode ser problemático para mais do que apenas listas imutáveis.
Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.