Java 8 デフォルトメソッド

Java 8 新特性Java 8 の新機能


Java 8 ではインターフェースにデフォルトメソッドが追加されました。

簡単に言うと、デフォルトメソッドとは、インターフェースが実装メソッドを持つことができ、実装クラスがそのメソッドを実装する必要がないというものです。

メソッド名の前に default キーワードを付けるだけでデフォルトメソッドを実装できます。

なぜこの機能が必要なのでしょうか?

まず、従来のインターフェースは諸刃の剣でした。利点は具体的なプログラミングではなく抽象指向であることであり、欠点はインターフェースを変更する必要がある場合、そのインターフェースを実装するすべてのクラスを変更する必要があることです。Java 8 以前のコレクションフレームワークには foreach メソッドがなく、通常考えられる解決策は、JDK で関連するインターフェースに新しいメソッドと実装を追加することです。しかし、すでにリリースされたバージョンでは、既存の実装に影響をとえずにインターフェースに新しいメソッドを追加することはできません。そこでデフォルトメソッドが導入されました。それらの目的は、インターフェースの変更と既存の実装の非互換性の問題を解決することです。

構文

デフォルトメソッドの構文は次のとおりです:

public interface Vehicle { default void print(){ System.out.println("私は車です!"); } }

複数のデフォルトメソッド

インターフェースにデフォルトメソッドがある場合、あるクラスが複数のインターフェースを実装し、それらのインターフェースが同じデフォルトメソッドを持つ状況を考えてみましょう。次の例は、この状況の解決方法を示しています:

public interface Vehicle { default void print(){ System.out.println("私は車です!"); } } public interface FourWheeler { default void print(){ System.out.println("私は四輪車です!"); } }

最初の解決策は、独自のデフォルトメソッドを作成して、インターフェースのデフォルトメソッドをオーバーライドすることです:

public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("私は四輪自動車です!"); } }

2 番目の解決策は、super を使用して指定されたインターフェースのデフォルトメソッドを呼び出すことです:

public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); } }

静的デフォルトメソッド

Java 8 のもう 1 つの機能は、インターフェースが静的メソッドを宣言(および実装を提供)できることです。例:

public interface Vehicle { default void print(){ System.out.println("私は車です!"); } //静的メソッド static void blowHorn(){ System.out.println("クラクションを鳴らします!!!"); } }

デフォルトメソッドの例

次のコードを使用してデフォルトメソッドの使用方法を理解できます。コードを Java8Tester.java ファイルに配置できます:

Java8Tester.java ファイル

public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print(){ System.out.println("私は車です!"); } static void blowHorn(){ System.out.println("クラクションを鳴らします!!!"); } } interface FourWheeler { default void print(){ System.out.println("私は四輪車です!"); } } class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("私は自動車です!"); } }

上記のスクリプトを実行すると、出力結果は次のようになります:

$ javac Java8Tester.java 
$ java Java8Tester
我是一辆车!
我是一辆四轮车!
按喇叭!!!
我是一辆汽车!

Java 8 新特性Java 8 の新機能

その他の拡張