Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida com Collections.unmodifiableList

Olá pessoal,

Achei muito interessante a forma como podemos devolver uma Collection no modo "read-only". Li o código da classe Collections a fim de tentar entender como que a Collection retornada pelo método unmodifiableList passa a possuir uma caracteristica de apenas leitura. Vi que UnmodifiableCollection possui uma Collection 'final' , ou seja, uma Collection constante. Isso define a nova caracteristica ? Fiz um teste simples declarando uma final List e tentei adicionar um novo objeto, e não houve o disparo da exception, o que é compreensivel pois não estou tentando modificar a referencia em que a variavel final está apontando.

Obrigado.

4 respostas

Se possível , post seu teste por favor!

Mario boa noite, o unmodifiableList retorna uma lista ou uma collection, no return do metodo e declarado o unmodifiableList e depois disso não é possivel fazer a alteração, como apagar ou até mesmo adicionar na lista. Ele retorna oque tiver na lista, você não ira conseguir apagar a nenhum elemento da lista, eu acho que também não ira adicionar pelo metodo add.

solução!

Olá!

A questão não é o final do atributo. No construtor todo conteúdo da lista é adicionado nesta nova implementação de List, ou no seu caso de Collection.

Olhe a implementação de UnmodifiableList por exemplo. Veja que qualquer método que não realiza modificação de conteúdo faz praticamente a mesma coisa. Porém os métodos que modificam algo lançam UnsupportedOperationException. Esta é a grande diferença em relação a implementação do ArrayList, o que explica sua diferença de comportamento.

Segue uma parte do código copiado para notar a diferença e facilitar a compreensão de todos.

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                  implements List<E> {
        private static final long serialVersionUID = -283967356065247728L;
        final List<? extends E> list;

        UnmodifiableList(List<? extends E> list) {
            super(list);
            this.list = list;
        }

        public boolean equals(Object o) {return o == this || list.equals(o);}
        public int hashCode()           {return list.hashCode();}

        public E get(int index) {return list.get(index);}
        public E set(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public void add(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public E remove(int index) {
            throw new UnsupportedOperationException();
        }
        public int indexOf(Object o)            {return list.indexOf(o);}
        public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}
        public boolean addAll(int index, Collection<? extends E> c) {
            throw new UnsupportedOperationException();
        }
        public ListIterator<E> listIterator()   {return listIterator(0);}

Espero ter ajudado. Abraço

Obrigado pelas respostas pessoal.