メソッド参照とデフォルトメソッドの利用

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());
        }
    }
}

このようにして、デフォルトメソッドをカスタマイズすることができます。

タグ: Java メソッド参照 デフォルトメソッド インターフェース

6月14日 19:48 投稿