A Importância das Interfaces

Extraído do site: www.portaljava.com

Uma boa orientação a objetos requer que sejam escondidas informações que não são relevantes para usuários de outras classes. No Java, este acesso é controlado através de keywords como private, protected e public. Estas palavras controlam a visibilidade de variáveis e métodos dentro de uma classe, mas se o planejamento das classes não for bem feito poderá haver muita informação visível e métodos não encapsulados adequadamente.
Uma forma de encapsular comportamento é através do uso de interfaces. Elas provêm uma maneira de esconder que classe realiza uma tarefa específica, determinando o comportamento mínimo que a classe deve suportar. Conforme o programa evolui, você pode mudar a implementação sem a necessidade de alterações na classe que a chama, já que o comportamento em si não mudou, apenas a classe que implementa este comportamento. Um lugar em que as interfaces são comumente utilizadas é na Framework de Collections. Ela define algumas interfaces prinipais que são implementadas por um número maior de classes. Aprendendo apenas as interfaces, você efetivamente aprendeu toda a framework, já que a implementação específica das classes normalmente não importa do ponto de visa do design.
Por exemplo, a interface List define uma coleção ordenada de elementos. Implementações disponíveis incluem ArrayList e LinkedList, em que ambas implementam a interface List. Quando seu programa precisa trabalhar com uma List, ele não deve se importar se é uma ArrayList ou uma LinkedList, apenas que qualquer que seja a classe usada ela irá prover um comportamento conhecido. Esse comportamento é a interface. Se suas classes estão implementando interfaces, e o comportamento é exposto apenas através de interfaces, você efetivamente encapsula a definição de sua classe, de forma que mudanças na implementação subjacente têm um impacto mínimo no resto do sistema.
Veja por exemplo uma ArrayList e LinkedList. Pense em uma ArrayList como uma array redimensionável de objetos. Ao mesmo tempo em que implementa completamente a interface List, ela é otimizada para condições específicas. Se o seu programa frequentemente provê acesso aleatórioao a dados da lista, a ArrayList oferece um acesso rápido aos elementos individuais. Este acesso rápido se dá através de um custo de lentidão nas operações de adicionar e remover elementos no meio da lista. Se este segundo comportamento é o que você deseja, então a classe LinkedList oferece uma melhor alternativa. Ela provê um rápido acesso sequencial, adições e exclusões, ao custo de um acesso aleatório mais lento. Ao trabalhar com ArrayList e LinkedList, há duas maneiras de criar objetos:
List cityList = new ArrayList(); LinkedList peopletList = new LinkedList();
Ambos pedaços de código compilam, mas existe uma diferença importante entre as duas linhas. A linha 1 significa que estamos criando uma ArrayList, mas precisamos acessá-la apenas como uma List. A linha 2 é praticamente o oposto. A LinkedList é criada da mesma forma que a ArrayList, porém no lado da declaração está escrito que o programa só poderá acessá-la como uma LinkedList.
Entender as interfaces realmente faz diferença quando o usuário das duas linhas decide que o comportamento "me dê o item n" é mais importante do que a tarefa de remover (ou adicionar) um item na posição n.
Na peopleList a variável foi decalarada como sendo do tipo LinkedList. Apesar de isso não estar errado, ao examinar o todo você perceberá que em qualqer lugar que a peopleList é usada ela poderá estar tratando o objeto como uma LinkedList. Se você utiliza métodos específicos para LinkedList, então haverá problemas na classe se você precisar tratá-la como ArrayList.
List peopleList = new ArrayList();
Aprendendo a trabalhar com um objeto apenas através de sua interface, você percebe que é possível alterar a implementação após o design sem mudanças de código além da declaração. Está é a grande utilizadade das interfaces. Como a classe foi originalmente declarada como LinkedList, a mudança para o tipo List significaria que chamadas de métodos como addFirst ou addLast seriam inaceitáveis, uma vez que a "nova" peopleList do tipo List não tem esses métodos.
Com um design baseado em interfaces, como o da Frameword de Collections, é possível que qualquer pessoa escreva seu código sem saber os detalhes da collection que está sendo utilizada. A classe utilizada é então restrita a prover a implementação completa da interface. Sem isso, o novo código não irá compilar.

Um mapa completo das interfaces utilizadas para collections pode ser visto em
http://java.sun.com/docs/books/tutorial/collections/interfaces/