Java 8のデフォルトメソッド(Default Methods)


Oracleの公式サイトでは、デフォルトメソッドについて説明しています.デフォルトメソッドを使用すると、インタフェースに新しい機能を追加し、古いバージョンのコードと互換性を保つことができます.つまり、元の実装クラスは受動的に変更する必要はありません.したがって、デフォルトのメソッドの位置はインタフェースの中にあります.デフォルトのメソッドには実装があり、特定のクラスは強制されません.Java 8はLambdaを十分に利用するには、大量のクラスライブラリを強化する必要があるが、互換性を実現するには、デフォルトの方法という大技しか使えない.
デフォルトのメソッド
デフォルトのメソッドは、通常のインタフェースメソッドと比較して、一番前にdefaultキーワードを追加し、パラメータリストの後に括弧を付けて、このメソッドを実装し、後にセミコロンがありません.
デフォルトメソッドの例
public interface Player {
    String getName();

    default boolean isMale() {
        return true;
    }
}

デフォルトメソッドを含むインタフェースの拡張
一方のインタフェースが他方のデフォルトメソッドを含むインタフェースを拡張する場合、以下の3つの処理方式がある.
  • デフォルトメソッドを完全に無視して親インタフェースのデフォルトメソッド
  • を直接継承する.
  • デフォルトメソッドを再申明デフォルトメソッドを抽象メソッドと再申明(実装なし、具体的なサブクラスは再実装する必要がある)
  • デフォルトメソッドを再実装デフォルトメソッドを書き換えた実装は、依然としてデフォルトメソッドである.

  • 抽象クラスインプリメンテーションは、デフォルトメソッドを含むインタフェースであり、上述した説明と同様である.特定のクラスインプリメンテーションは、デフォルトのメソッドを含むインタフェースを実装し、2番目のエントリはありません.
    インタフェース静的メソッド
    Java 8インタフェースにも静的な方法があります.静的メソッドは、職責の位置づけから言えば、ツールメソッドです.
    public interface Player {
        String getName();
    
        public static void printContact(Contact contact) {
            // TODO print contact for play in the following
        }
    }
    

    インタフェースと抽象クラス
    どこかで見た覚えがありますが、Javaの父は、もう一度Javaを設計する機会を与えれば、Javaには抽象的なクラスはないと言いました.面接でもインタフェースと抽象類の違いを聞くことが多いです.
    総じて抽象クラスとインタフェースがますます近づいてきたのは,インタフェースが抽象クラスに近づき,抽象クラスの生存空間を奪うことである.デフォルトの方法とインタフェースの静的方法はいずれも重武器です.
  • 抽象クラスに比べてインタフェースができない
  • 抽象クラスはstatic final以外の属性(field)を定義することができ、インタフェースはできない.インタフェースのプロパティはすべてstatic finalです.
  • 抽象クラスは、インタフェースができない非publicメソッドを定義することができる.インタフェースの方法はすべてpublicです.

  • インタフェースに比べて抽象クラスではできない
  • インタフェースはマルチ継承(実装)できますが、抽象クラスはできません.抽象クラスは単一でのみ継承できます.


  • 締めくくり
    デフォルトメソッドはJDKで主に既存のクラスライブラリを拡張するために使用されていますが、新しいプロジェクトのデフォルトメソッドは依然として価値があります.かつての書き込みインタフェースは、抽象クラスを書き、具体的なクラスを書くという流れで、中間のこのステップを省くことができます.また、インタフェースにはツールメソッド(インタフェース静的メソッド)も格納できます.ただし、インタフェースのメソッドはpublicであることを覚えておいて、アクセスを厳格に制御するには抽象クラスを使用する必要があります.