interfaces sind das wichtigste Mittel, um die Verwendung einer Klasse von ihrer Implementierung zu entkoppeln.
Diese Entkopplung macht die Pflege der Implementierung flexibler und unterstützt typsicheres generisches Verhalten.
Die Syntax eines Interface ähnelt der einer Klasse, mit dem Unterschied, dass Methoden nur als Signatur erscheinen und kein Rumpf angegeben wird.
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);
}
Die implementierende Klasse muss alle Operationen implementieren, die das Interface definiert.
Interfaces erfüllen typischerweise einen oder mehrere der folgenden Zwecke:
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();
}
}
Code, der die oben genannten Interfaces und Klassen verwendet, kann:
Interfaces werden häufig eingesetzt, um Tests zu unterstützen, weil sie einfaches Mocking ermöglichen.
Interfaces können andere Interfaces mit dem Schlüsselwort extend erweitern.
Die Member eines Interface sind standardmäßig public.
Interfaces können verschachtelte Typen enthalten: interfaces, enums und classes.
Die umgebenden Interfaces fungieren dabei als Namensräume.
Von außerhalb des Interface greifst du auf verschachtelte Typen zu, indem du den Namen des Interface voranstellst und mit der Punkt-Syntax das Member benennst.
Java unterstützt bewusst keine Mehrfachvererbung, ermöglicht aber über Interfaces eine Art von Mehrfachvererbung.
Außerdem bildet das Konzept, dass sich Polymorphismus über Interfaces umsetzen lässt, die Grundlage des Interface-Mechanismus.