Utilizamos interfaces quando queremos “firmar um contrato”.
Por exemplo, vamos supor que temos duas classes:
public class Word {
public void imprime() {
//implementação específica para imprimir um arquivo Word
}
}
e
public class PDF {
public void imprime() {
//implementação específica para imprimir um arquivo PDF
}
}
Não é novidade para ninguém que arquivos em Word e PDF são “imprimiveis”.
Se tivéssemos uma classe utilitária chamada ImpressoraUtil
, precisaríamos criar um método que imprime, especificamente, um arquivo em Word e outro método que imprime um arquivo em PDF.
Algo como:
public class ImpressoraUtil() {
public void imprimeWord(Word arquivo) {
arquivo.imprime();
}
public void imprimePDF(PDF arquivo) {
arquivo.imprime();
}
}
Temos que fazer assim pois não podemos garantir que todos as classes que representam arquivos “imprimveis” tem o método imprime()
.
É exatamente aí que entra a aplicação de Interfaces.
Podemos criar uma Interface chamada de Imprimivel
(eu sei que essa palavra não existe, mas é para exemplo).
public interface Imprimivel {
void imprime();
}
A partir daí, toda classe que desejamos que seja “imprimivel”, podemos apenas implementar a interface pois ao implementá-la, o Java nos obriga a darmos uma implementação ao método void imprime()
:
public class Word implements Imprimivel {
public void imprime() {
//implementação específica para imprimir um arquivo Word
}
}
e
public class PDF implements Imprimivel {
public void imprime() {
//implementação específica para imprimir um arquivo PDF
}
}
E agora, na nossa classe podemos ter um único método que recebe algo “imprimivel”. Veja:
public class ImpressoraUtil() {
//repare que o tipo do parâmetro é uma interface, ou seja, esse método recebe um objeto de qualquer classe que implementa a interface Imprimivel
public void imprime(Imprimivel arquivo) {
arquivo.imprime(); //pelo contrato da interface, sabemos que TODA classe que implementar a interface Imprimivel terá o método imprime() implementado da sua forma especializada.
}
}
Depois de tudo isso, minha opinião sobre a sua pergunta: eu costumo utilizar interfaces para “forçar” comportamentos… Não sei se esse é o seu caso.
No seu caso, EU faria uma outra classe chamada Opcional
e a classe Veiculo
teria uma lista de opcionais.
public class Opcional {
private String nomeDoOpcional;
//getters e setters
}
public class Veiculo {
private List<Opcional> opcionais;
}
Espero ter ajudado.
Abs.