interfacesは、クラスの使われ方をその実装から切り離すための主な手段です。
この切り離しによって、実装を保守するときの柔軟性が生まれ、型安全な汎用的な振る舞いを支えやすくなります。
インターフェースの構文はクラスとよく似ていますが、メソッドはシグネチャだけを書き、本体を持たない点が異なります。
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);
}
実装するクラスは、そのインターフェースで定義されたすべての操作を実装しなければなりません。
インターフェースは、ふつう次のうち1つ以上を担います。
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();
}
}
以上のインターフェースとクラスを使うコードでは、次のことができます。
インターフェースは、簡単にモックを作れるため、テストを支えるためにも広く使われています。
インターフェースは、extendキーワードを使って他のインターフェースを拡張できます。
インターフェースのメンバーは、デフォルトでpublicです。
インターフェースは入れ子の型を含むことができます。interfaces・enums・classesです。
ここでは、含んでいる側のインターフェースが名前空間の役割を果たします。
入れ子の型に外からアクセスするには、インターフェース名を前に付け、ドット記法でメンバーを指定します。
Javaは設計上、多重継承をサポートしていませんが、インターフェースを通じて一種の多重継承を可能にしています。
さらに、インターフェースを通じてポリモーフィズムを実装できるという考え方が、インターフェースの仕組みを支えています。