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

Dúvida no Ex. 11 da Aula 5 - Collections framework

Na verdade não é um dúvida.

A questão é que já vi várias vezes no curso a frase: " programe voltado a interface, e não à implementação!". Para mim(como iniciante) a frase não está clara, vcs poderiam fazer uma analogia para ver se eu consigo entendê-la melhor.

obrigado.

Luis

7 respostas
solução!

Olá Luis, tudo bem!?

O java possui uma API( um conjunto de classes e interfaces ) para trabalhar com coleções. Nesta API, há implementações(Classes) prontas para resolver problemas que envolvam coleções. Por exemplo:

Caso você precise trabalhar com um Array de Conta ou de qualquer outro tipo de classe, você não precisa mais ter todo o árduo trabalho de se preocupar com a implementação de um Array para Conta. Você pode fazer uso de uma classe ArrayList, por exemplo, que implementa a interface List. Ou seja, um ArrayList, implementa todos os métodos declarados na Interface List. O "contrato" é assinado e, logo, você tem a garantia de que seu ArrayList é um List.

Caso você precise de mais performance, na inserção, por exemplo, você pode mudar a implementação do ArrayList para outra.

Veja o seguinte:

ArrayList<Conta> numeros = new ArrayList<Conta>();

No caso acima, eu estou dizendo que minha coleção de números é to dipo ArrayList de Conta... Caso eu precisasse mudar minha implementação, não conseguiria. Neste caso, há um certo acoplamento entre a declaração do tipo e implementação. No entanto, veja de outra forma:

List<Conta> contas;
contas = new ArrayList<Conta>();
contas = new LinkedList<Conta>();

No caso acima, eu disse que possuo contas do tipo List, certo? Sendo assim, qualquer um que "É UM" List, pode ter sua referência atribuída a contas.

Acredito que nesse exercício, seja usado todos os métodos declarados em List. Então, fica mais fácil de mudar a implementação, caso precise, programando voltado à interface:

List<Conta> contas = new ArrayList<Conta>();
//ou
List<Conta> contas = new LinkedList<Conta>();

do que voltado à implementação:

ArrayList<Conta> contas = new ArrayList<Conta>();
//ou
LinkedList<Conta> contas = new LinkedList<Conta>();

Este é apenas um exemplo de programar voltado à interface. Isto pode ser bastante utilizado na passagem de parâmetros dos métodos, que permite o uso do polimorsismo de referência.

Abs, Bruno.

Ok, obrigado Bruno.

Imagina, caro Luis. O fórum está aí para isso!!!

Tenho parcicipado do fórum e visto que tanto os instrutores como os colegas são bem solícitos!! Sou adepto do "nunca ficar com dúvida"!!!

:)

Grande abraço e sucesso com o curso!

ótima explicação!!!

Vou tentar explicar de outra forma: Você vai sair de férias e pensa: "Preciso de um transporte" (interface), para ir a uma determinada praia. Se você mora na lua isso vai ser um problema e o único transporte seria uma nave espacial (implementação da interface transporte). Se você mora na terra e numa cidade onde não há praia, você poderia ir de:

carro (implementação da interface);
de helicóptero (outra implementação da interface transporte);
de avião (implementação da interface);
de ônibus (implementação da interface);

Se a cidade onde você mora tem praias você poderia ir:

de bicicleta (implementação de interface)
de moto (implementação de interface)
de charrete (implementação de interface)

Programar voltado a interface é dizer que você quer um transporte e poder usar a melhor implementação deste transporte para aquele momento. Se as estradas estiverem com muitos buracos talvez seja melhor ir de avião, ou de barco e não de carro. Agora imagine que inventaram a máquina de teletransporte (implementação de transporte) e se você programou usando a interface e não a implementação, fazer esta troca seria algo como:

Transporte meio_transporte = new Aviao();// jeito antigo
Transporte meio_transporte = new Teletransporte();//jeito novo de viajar

Se o seu código estivesse todo voltado para usar uma bicicleta (implementação de transporte), por exemplo, adaptar ele para passar a usar um avião deveria ser bem mais complicado, não concorda?

Muito esclarecedoras ambas as explicações, mas a última foi super didática e me fez entender de vez o que significa "programar voltado a interface, e não à implementação".

Realmente todas as explicações foram muito boas, mas a do Plilipe foi muito didática mesmo (criativa). Eu já havia entendido o conceito, mas foi importante para confirmar o que eu já havia entendido. Obrigado! Bons estudos a todos!!!