Estou iniciando em Java e gostaria de tirar uma dúvida. Quando criamos uma Interface que tem somente métodos abstratos e criamos classes que vão implementar métodos significa que garantimos o encapsulamento? A interface é garantia de encapsulamento?
Tome cuidados com afirmações como esta [quote=“deivid.carvalho.cruz, post:1, topic:346602”]
uma Interface que tem somente métodos abstratos
[/quote]
Isso não é mais verdade, a partir da versão 8 do java interfaces podem implementar o default method.
Mas, sim, a interface é a garantia de que você vai utilizar encapsulamento em teu código…
Apenas complementando.
O conceito de encapsulamento, dentro da orientação a objetos, diz que você deve proteger seus dados.
Quando você está utilizando classes, você tem seus atributos e os define como privados, logo, cria métodos assessores (getters e setters) para ter acesso a definir e a obter os valores que os mesmos armazenam.
public class Foo {
private String fii;
public void setFii(String fii) {
this.fii = fii;
}
public String getFii() {
return this.fii;
}
}
Até aqui, tudo bem.
Mas, e se quisermos que esta proteção ocorra a nível de classe?
Aí entra a interface.
Uma das ideias por trás do uso de interfaces é salvaguardar que a implementação da lógica ficará separada e protegida, podendo, a qualquer tempo, ser alterada e melhorada, sem que o conjunto de camadas envolvidas seja prejudicado.
É sempre correto e boa prática retornar o mais alto nível hierárquico em um método:
//ao invés de
public ArrayList<String> obtemListaDeNomes() {
//Qualquer lógica aqui
}
//Usar
public Collection<String> obtemListaDeNomes() {
//Quaquer lógica aqui
}
Afinal, se quisermos mudar o retorno e não mais devolver um ArrayList, mas um HashSet, ele atenderá sem problemas.
Existem mais pormenores, mas não quero me delongar. Assim sendo, sempre que falarem em encapsulamento você pode pensar em interfaces. E quando falarem em baixo acoplamento e alta coesão, também,