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

Polimorfismo e unmodifiablelist

Com o polimorfismo, é possível "driblar" as restrições do unmodifiablelist, como por exemplo no código abaixo (similar ao "sort" visto na aula):

        List<Aula> aulas = new ArrayList<Aula>(aulasImutaveis);
        aulas.add(new Aula("Testando truques", 22));

Sendo assim, o que o unmodifiable limita os métodos, mas é possível flexibilizá-los novamente através do polimorfismo, forçando a criação de um objeto de classe mais genérica.

Qual a real vantagem do unmodifiable, então?

E como esse uso de polimorfismo aparece em projetos reais?

4 respostas

Fala André, tudo bem?

Na verdade, quando você fez:

new ArrayList<Aula>(aulasImutaveis);

foi criado uma nova lista mutável com os elementos de uma lista imutável, ou seja, você criou outra lista:

public class Main {
    public static void main(String[] args) {
        List<String> linguagens = Collections.unmodifiableList(Arrays.asList("C++"));
        // linguagens.add("Go"); // Lança UnsupportedOperationException

        List<String> aulas = new ArrayList<>(linguagens);
        aulas.add("Java"); // Funciona normalmente
    }
}

Sim, foi criada outra lista! Essa criação de uma nova lista foi o que chamei de "driblar".

Entendi que os ganhos na imutabilidade são vários, como por exemplo encapsulamento, proteção contra alterações indesejáveis etc.

Porém, se é possível criar um objeto mutável que recebe um objeto imutável, essas características não são de certa forma diluídas?

Falando de outro jeito: qual a vantagem de proteger um objeto se é possível criar um similar a esse, mas mutável? O que realmente é protegido, nesse caso?

solução!

A ideia é que o objeto retornado por unmodifiableList não possa ser alterado diretamente, mas possa mudar por outros meios (efetivamente alterando diretamente a coleção interna).

Enquanto algo tiver acesso à lista interna, a coleção "não modificável" poderá ser alterada.

É por isso que você geralmente constrói uma coleção não modificável e garante que nada possa chegar à lista interna:

Collection<Integer> umodifiableCollection = Collection.umodifiableCollection(Arrays.asList(1, 2, 3));

Como nada nunca faz referência ao List criado por asList, essa é uma coleção verdadeiramente inalterável.

Tem uma lib que tem uma implementação de lista inalterável: https://github.com/google/guava

Bem legal!

Obrigado :)