LoginSignup
13
11

More than 5 years have passed since last update.

[java8] 6回目:インタフェースのデフォルト実装

Posted at

前回:ラムダ式とStreamAPI

今回はインタフェースのデフォルト実装です。
Java7までは、インタフェースを定義した場合、実装クラス側で全てのメソッドを実装する必要がありました。

Java8からは、defaultキーワードを付与することで、インタフェースに実装を持たせることが可能です。
もちろん、実装クラス側でオーバーライドすることも可能です。

いくつかのサンプルを見てみましょう。

デフォルト実装をそのまま使う

public interface HelloJava {
    default void helloJava() {
        System.out.println("Hello Java! default.");
    }
}

// 実装クラス。
class Hello implements HelloJava {
    // オーバーライドしない
}

public class SamppleDefaultIf {
    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.helloJava();
    }
}

結果

Hello Java! default.

インタフェース側でデフォルト実装した内容が出力されています。

実装クラス側でオーバーライドする

// 実装クラス。
class Hello implements HelloJava {
    @Override
    public void helloJava() {
        System.out.println("Hello Java! override.");
    }
}

public class SamppleDefaultIf {
    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.helloJava();
    }
}

結果

Hello Java! override.

複数のインタフェース(多重継承風)

public interface HelloPython {
    default void helloPython() {
        System.out.println("Hello Python! default.");
    }
}

// 実装クラス。
class Hello implements HelloJava, HelloPython {

}

public class SamppleDefaultIf {
    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.helloJava();
        hello.helloPython();
    }
}

結果

Hello Java! default.
Hello Python! default.

インタフェースなので、複数定義することも可能です。

最後に

今まではabstractクラスでデフォルト実装をして、それを自クラスで継承して使っていたと思いますが、
インタフェース側に持たせることで、設計方法も変わるのかなと思ったりしています。

次回は、もう少し踏み込んだ内容に挑戦したいと思います。

13
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11