interfaces são o principal meio de desacoplar a utilização de uma classe da sua implementação.
Este desacoplamento dá flexibilidade à manutenção da implementação e ajuda a suportar comportamento genérico com segurança de tipos.
A sintaxe de uma interface é semelhante à de uma classe, com a diferença de que os métodos aparecem apenas como assinatura e não é fornecido qualquer corpo.
public interface Language {
String speak();
}
public interface ItalianLanguage extends Language {
String speak();
String speakItalian();
}
public interface ScriptConverter {
void setVersion(String version);
String getVersion();
String convertCyrillicToLatin(String cyrillic);
}
A classe que implementa a interface tem de implementar todas as operações definidas por ela.
Normalmente, as interfaces fazem uma ou mais das seguintes coisas:
Comparable<T>)public class ItalianTraveller implements ItalianLanguage {
public String speak() {
return "Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class ItalianTravellerV2 implements ItalianLanguage {
public String speak() {
return "migliorata - Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class FrenchTraveller implements Language {
public String speak() {
return "Ça va?";
}
}
public class RussianTraveller implements Language, ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String speak()
{
return "Привет мир";
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
public class DocumentTranslator implements ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String translate(String russian) {
throw new UnsupportedOperationException();
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
O código que utiliza as interfaces e as classes acima pode:
As interfaces são amplamente utilizadas para apoiar os testes, pois permitem um mocking fácil.
As interfaces podem estender outras interfaces com a palavra-chave extend.
Os membros de uma interface são públicos por omissão.
As interfaces podem conter tipos aninhados: interfaces, enums e classes.
Aqui, as interfaces que os contêm funcionam como namespaces.
Os tipos aninhados são acessíveis fora da interface ao prefixar o nome da interface e usar a sintaxe de ponto para identificar o membro.
Por conceção, o Java não suporta herança múltipla, mas facilita um tipo de herança múltipla através das interfaces.
Além disso, o conceito de que o polimorfismo pode ser implementado através de interfaces está na base do mecanismo das interfaces.