Las interfaces son el medio principal para desacoplar los usos de una clase de su implementación.
Este desacoplamiento brinda flexibilidad para el mantenimiento de la implementación y ayuda a respaldar un comportamiento genérico con seguridad de tipos.
La sintaxis de una interfaz es similar a la de una clase, excepto que los métodos aparecen solo como la firma y no se proporciona un cuerpo.
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);
}
La clase que la implementa debe implementar todas las operaciones definidas por la interfaz.
Por lo general, las interfaces hacen una o más de las siguientes cosas:
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();
}
}
El código que usa las interfaces y clases anteriores puede:
Las interfaces se usan ampliamente para facilitar las pruebas, ya que permiten un mocking sencillo.
Las interfaces pueden extender otras interfaces con la palabra clave extend.
Los miembros de una interfaz son públicos por defecto.
Las interfaces pueden contener tipos anidados: interfaces, enums y classes.
Aquí, las interfaces contenedoras actúan como espacios de nombres.
Se accede a los tipos anidados desde fuera de la interfaz anteponiendo el nombre de la interfaz y usando la sintaxis de punto para identificar al miembro.
Por diseño, Java no admite la herencia múltiple, pero facilita una especie de herencia múltiple a través de las interfaces.
Además, el concepto de que el polimorfismo se puede implementar a través de las interfaces sustenta el mecanismo de las interfaces.