Java 9プライベートインターフェースメソッド:カプセル化とコード再利用を強化
Java 8以前では、インターフェースには以下のタイプの変数/メソッドのみ定義可能でした。
- 定数変数
- 抽象メソッド
つまり、インターフェースにメソッド実装、より正確にはデフォルト実装を持たせることはできませんでした。例を見てみましょう。
Java 8での改善:デフォルトメソッドとstaticメソッド
Java 8からインターフェースに以下が追加されました。
- 定数変数
- 抽象メソッド
- デフォルトメソッド
- Staticメソッド
共通処理(DB接続の開閉など)をインターフェースのデフォルトメソッドとstaticメソッドにまとめることで、実装クラスでの重複を排除できます。
Java 9でのさらなる改善:プライベートメソッド
Java 9ではインターフェースに以下が追加されました。
- 定数変数
- 抽象メソッド
- デフォルトメソッド
- Staticメソッド
- プライベートメソッド
- プライベートStaticメソッド
プライベートメソッドを使うことで、デフォルトメソッド間で共通ロジックを共有しつつ、外部に公開しないヘルパーメソッドを定義できます。
Java 9での実装例
public class Tester {
public static void main(String[] args) {
LogOracle log = new LogOracle();
log.logInfo("");
log.logWarn("");
log.logError("");
log.logFatal("");
LogMySql log1 = new LogMySql();
log1.logInfo("");
log1.logWarn("");
log1.logError("");
log1.logFatal("");
}
}
final class LogOracle implements Logging { }
final class LogMySql implements Logging { }
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
// プライベートメソッド(共通ロジック)
private void log(String message, String prefix) {
getConnection();
System.out.println("Log Message : " + prefix);
closeConnection();
}
// デフォルトメソッドからプライベートメソッドを呼び出し
default void logInfo(String message) { log(message, "INFO"); }
default void logWarn(String message) { log(message, "WARN"); }
default void logError(String message) { log(message, "ERROR"); }
default void logFatal(String message) { log(message, "FATAL"); }
// プライベートStaticメソッド
private static void getConnection() {
System.out.println("Open Database connection");
}
private static void closeConnection() {
System.out.println("Close Database connection");
}
}
出力
Open Database connection Log Message : INFO Close Database connection Open Database connection Log Message : WARN Close Database connection Open Database connection Log Message : ERROR Close Database connection Open Database connection Log Message : FATAL Close Database connection
複数のデフォルトメソッド衝突の解決
2つのインターフェースに同名のデフォルトメソッドがある場合の解決方法:
- 実装クラスで独自メソッドを定義してオーバーライド
InterfaceName.super.methodName()で特定のインターフェースのデフォルトメソッドを明示呼び出し
Java
- Javaメソッド:定義、呼び出し、効果的な活用法
- Javaアクセス修飾子の完全ガイド:種類、ルール、実践例
- Java抽象クラスとメソッド:包括的ガイド
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java NavigableSetインターフェースをマスター:ナビゲーション、ソート、実践例
- Javaラムダ式完全ガイド:基礎からStream APIまで
- Java String toLowerCase() & toUpperCase():ロケール対応テキストケース変換
- Javaインターフェース完全ガイド: 定義・実装・多重継承・タグインターフェース
- Javaでメールを送信する方法:ステップバイステップガイド
- Java 9コレクションファクトリメソッド:不変List、Set、Mapを簡潔に作成
- Java 8デフォルトメソッド解説:インターフェース拡張と後方互換性