抽象クラスとインターフェースのどちらかを選択する場合は常に、(ほぼ) デフォルト (ディフェンダーまたは仮想拡張とも呼ばれる) メソッドを優先する必要があります。
デフォルトのメソッドは、インターフェースの古典的なパターンと、そのインターフェースのほとんどまたはすべてのメソッドを実装するコンパニオン クラスに終止符を打ちました。例はCollection and AbstractCollection
です。ここで、インターフェイス自体にメソッドを実装して、デフォルトの機能を提供する必要があります。インターフェイスを実装するクラスは、メソッドをオーバーライドするか、デフォルトの実装を継承するかを選択できます。
デフォルト メソッドのもう 1 つの重要な用途は ですinterface evolution
。次のようなクラス Ball があるとします。
public class Ball implements Collection { ... }
Java 8 では、新しい機能ストリームが導入されました。stream
インターフェイスに追加されたメソッドを使用してストリームを取得できます。stream
デフォルトのメソッドではない場合Collection
、この新しいメソッドを実装していないため、インターフェイスのすべての実装が壊れていたでしょう。インターフェイスにデフォルト以外のメソッドを追加することは、source-compatible
.
しかし、クラスを再コンパイルせず、このクラスを含む古い jar ファイルを使用するとしますBall
。この欠落したメソッドがなくてもクラスは正常にロードされ、インスタンスを作成でき、すべてが正常に機能しているようです。しかしstream
、プログラムがのインスタンスでメソッドを呼び出すBall
と、 が得られAbstractMethodError
ます。したがって、メソッドをデフォルトにすることで両方の問題が解決しました。
Java 9には、デフォルトの実装を提供するインターフェース メソッドで使用された共通コード ロジックをカプセル化するために使用できる、インターフェース内のプライベート メソッドさえあります。