Javaでメソッド参照やデフォルトメソッドを使用することで、コードを簡潔かつ強力にすることができます。ここでは、これらの機能をどのように活用するかについて説明します。
メソッド参照の使用
ラムダ式は匿名メソッドを作成するために便利ですが、既存のメソッドを単に呼び出すだけの場合、メソッド参照を使う方が読みやすくなります。
public class User {
private String name;
private LocalDate birthDate;
public int getAge() {
// 計算処理
}
public static int compareByAge(User a, User b) {
return a.birthDate.compareTo(b.birthDate);
}
}
User[] users = { /* データ初期化 */ };
Arrays.sort(users, User::compareByAge);
この例では、`User::compareByAge`は`(a, b) -> User.compareByAge(a, b)`と同じ意味を持ちます。
メソッド参照の種類
| 種類 | 構文 | 例 |
|---|---|---|
| 静的メソッド参照 | `*クラス名*::*静的メソッド名*` | `User::compareByAge` |
| 特定オブジェクトのインスタンスメソッド参照 | `*オブジェクト*::*インスタンスメソッド名*` | `myComparator::compareByName` |
| 特定タイプの任意オブジェクトのインスタンスメソッド参照 | `*型名*::*メソッド名*` | `String::compareToIgnoreCase` |
| コンストラクタ参照 | `*クラス名*::new` | `HashSet::new` |
デフォルトメソッドの利用
デフォルトメソッドにより、インターフェースに新しい機能を追加できますが、既存の実装との互換性を保つことが可能です。
public interface TimeClient {
void setTime(int hour, int minute, int second);
LocalDateTime getLocalDateTime();
default ZonedDateTime getZonedDateTime(String zoneId) {
return ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneId));
}
}
上記のインターフェースでは、`getZonedDateTime`がデフォルトメソッドとして定義されています。これにより、`TimeClient`を実装するクラスは、このメソッドを直接実装しなくても使用できます。
デフォルトメソッドの継承
インターフェースがデフォルトメソッドを持つ場合、それを拡張するインターフェースも同じメソッドを持つことになります。ただし、必要に応じてそのメソッドを再定義することも可能です。
public interface AdvancedTimeClient extends TimeClient {
default ZonedDateTime getZonedDateTime(String zoneId) {
try {
return ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneId));
} catch (DateTimeException e) {
System.err.println("Invalid zone ID: " + zoneId + "; using default time zone instead.");
return ZonedDateTime.of(getLocalDateTime(), ZoneId.systemDefault());
}
}
}
このようにして、デフォルトメソッドをカスタマイズすることができます。