インターフェースのデフォルトメソッド
インターフェースにメソッド実装を直接追加し、多重継承を可能にする。
コード比較
✕ Java 7
// Need abstract class to share behavior
public abstract class AbstractLogger {
public void log(String msg) {
System.out.println(
timestamp() + ": " + msg);
}
abstract String timestamp();
}
// Single inheritance only
public class FileLogger
extends AbstractLogger { ... }
✓ Java 8+
public interface Logger {
default void log(String msg) {
IO.println(
timestamp() + ": " + msg);
}
String timestamp();
}
// Multiple interfaces allowed
public class FileLogger
implements Logger, Closeable { ... }
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
多重継承
クラスは複数のインターフェースのデフォルトメソッドを実装できます(単一継承のクラスとは異なります)。
APIの進化
既存の実装を壊さずにインターフェースに新しいメソッドを追加できます。
組み合わせ可能な動作
複数のインターフェースから機能を自由に組み合わせられます。
旧来のアプローチ
共有動作のための抽象クラス
モダンなアプローチ
インターフェースのデフォルトメソッド
JDKバージョン
8
難易度
中級
JDKサポート
インターフェースのデフォルトメソッド
利用可能
JDK 8(2014年3月)以降、利用可能
仕組み
Java 8以前、無関係なクラス間で動作を共有するには抽象クラスが必要で、単一継承に制限されていました。デフォルトメソッドにより、インターフェースにメソッド実装を提供できるようになり、クラスは複数のインターフェースから動作を継承できます。これはCollections API(List.forEach、Map.getOrDefaultなど)を既存の実装を壊さずに進化させるために不可欠でした。
関連ドキュメント