インターフェースのprivateメソッド
privateメソッドを使ってインターフェース内の共有ロジックを抽出する。
コード比較
✕ Java 8
interface Logger {
default void logInfo(String msg) {
System.out.println(
"[INFO] " + timestamp() + msg);
}
default void logWarn(String msg) {
System.out.println(
"[WARN] " + timestamp() + msg);
}
}
✓ Java 9+
interface Logger {
private String format(String lvl, String msg) {
return "[" + lvl + "] " + timestamp() + msg;
}
default void logInfo(String msg) {
IO.println(format("INFO", msg));
}
default void logWarn(String msg) {
IO.println(format("WARN", msg));
}
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
コードの再利用
重複なしにデフォルトメソッド間でロジックを共有できます。
カプセル化
実装の詳細が実装クラスから隠蔽されます。
DRYなインターフェース
デフォルトメソッド間でのコピー&ペーストがなくなります。
旧来のアプローチ
重複したロジック
モダンなアプローチ
privateメソッド
JDKバージョン
9
難易度
中級
JDKサポート
インターフェースのprivateメソッド
利用可能
JDK 9(2017年9月)以降、広く利用可能
仕組み
Java 9ではインターフェースにprivateメソッドが使えるようになり、実装の詳細を実装クラスに公開することなく、デフォルトメソッド間でコードを共有できます。
関連ドキュメント