[前回:ラムダ式とStreamAPI]
(http://qiita.com/yuusuke_s/items/87245794da0ac3271dc7)
今回はインタフェースのデフォルト実装です。
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クラスでデフォルト実装をして、それを自クラスで継承して使っていたと思いますが、
インタフェース側に持たせることで、設計方法も変わるのかなと思ったりしています。
次回は、もう少し踏み込んだ内容に挑戦したいと思います。