トラック
/
Java
Java
/
シラバス
/
インターフェース
イン

インターフェース の Java

1個の演習

インターフェースについて

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つ以上を担います。

  • 利用側のコードが、いくつもの異なるクラスを汎用的に扱えるようにします。 この場合、インターフェースは基底クラスと同じ役割を果たしています。 その例がjava.io.InputStreamです。
  • 特定の目的のために、機能の一部だけを公開します(たとえばComparable<T>など)
  • 複数の実装が共存できるように、クラスの公開APIを公開します。 その例がテストダブルです。
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は設計上、多重継承をサポートしていませんが、インターフェースを通じて一種の多重継承を可能にしています。

さらに、インターフェースを通じてポリモーフィズムを実装できるという考え方が、インターフェースの仕組みを支えています。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

インターフェースを学習する