Listar versus ArrayList como tipo de referência?

Ok, então eu sei que Set , List e Map são interfaces, mas o que torna a primeira linha de código melhor que a segunda?

 List myArr = new ArrayList(); ArrayList myArr = new ArrayList(); 

Se você usar o primeiro formulário, você está dizendo que tudo o que você vai usar é a funcionalidade da interface List – nada mais, especialmente nada extra adicionado por qualquer implementação do mesmo. Isso significa que você pode facilmente alterar a implementação usada (por exemplo, apenas replace LinkedList for ArrayList na instanciação), e não se preocupar com isso quebrando o resto do código porque você pode ter usado algo específico para ArrayList .

Um princípio geral útil sobre tipos na programação (às vezes chamado de princípio da robustez ) é o seguinte:

  • Seja liberal sobre o que você aceita
  • Seja conservador sobre o que você emite

A lista é mais liberal do que a ArrayList, já que List pode ser qualquer tipo de implementação de List, por exemplo, uma ArrayList, uma LinkedList ou uma FrancosSpecialList. Por isso, é uma boa ideia ser liberal e aceitar qualquer tipo de lista, pois você pode querer alterar a implementação posteriormente.

A principal razão para usar ArrayList explicitamente como um tipo (seu segundo caso) é se você precisa usar methods específicos para ArrayList que não estão disponíveis através da interface List. Nesse caso, uma Lista genérica não funcionará (a menos que você queira fazer muita conversão feia e confusa), assim você também pode ser explícito e usar uma ArrayList diretamente. Isso tem a vantagem adicional de sugerir a um leitor que os resources específicos do ArrayList são necessários.

Como você pode ver na fonte ArrayList aqui , a maioria dos methods implementados são anotados como @override porque todos eles são definidos através da interface List , então, se você vai usar apenas funcionalidades básicas (é isso que você vai fazer mais do tempo) a diferença não será prática.

A diferença virá se algum dia você achar que os resources da ArrayList não são mais adequados para o seu tipo de problema e você precisará de algo diferente (uma LinkedList por exemplo). Se você declarou tudo como List mas instanciado como ArrayList você irá facilmente mudar para a nova implementação mudando as instanciações para o new ArrayList() enquanto no outro caso você terá que alterar também todas as declarações de variables.

Usar List list = new ArrayList() é mais estilo OOP, já que você declara que não se importa com a implementação específica da lista e que deseja descartar as informações estáticas sobre o tipo, já que dependerá da interface fornecida por este tipo de coleção abstraindo de sua implementação.