609

Java 8 では、 Default Methodsと呼ばれるインターフェースでメソッドのデフォルト実装が可能です。

(with )interface default methodの代わりにそのような , をいつ使用するかについて混乱しています。abstract classabstract method(s)

では、いつデフォルト メソッドとのインターフェイスを使用し、いつ (抽象メソッドを含む) 抽象クラスを使用する必要があるのでしょうか? そのシナリオで抽象クラスはまだ役に立ちますか?

4

16 に答える 16

21

抽象クラスとインターフェースのどちらかを選択する場合は常に、(ほぼ) デフォルト (ディフェンダーまたは仮想拡張とも呼ばれる) メソッドを優先する必要があります。

  1. デフォルトのメソッドは、インターフェースの古典的なパターンと、そのインターフェースのほとんどまたはすべてのメソッドを実装するコンパニオン クラスに終止符を打ちました。例はCollection and AbstractCollectionです。ここで、インターフェイス自体にメソッドを実装して、デフォルトの機能を提供する必要があります。インターフェイスを実装するクラスは、メソッドをオーバーライドするか、デフォルトの実装を継承するかを選択できます。

  2. デフォルト メソッドのもう 1 つの重要な用途は ですinterface evolution。次のようなクラス Ball があるとします。

    public class Ball implements Collection { ... }

Java 8 では、新しい機能ストリームが導入されました。streamインターフェイスに追加されたメソッドを使用してストリームを取得できます。streamデフォルトのメソッドではない場合Collection、この新しいメソッドを実装していないため、インターフェイスのすべての実装が壊れていたでしょう。インターフェイスにデフォルト以外のメソッドを追加することは、source-compatible.

しかし、クラスを再コンパイルせず、このクラスを含む古い jar ファイルを使用するとしますBall。この欠落したメソッドがなくてもクラスは正常にロードされ、インスタンスを作成でき、すべてが正常に機能しているようです。しかしstream、プログラムがのインスタンスでメソッドを呼び出すBallと、 が得られAbstractMethodErrorます。したがって、メソッドをデフォルトにすることで両方の問題が解決しました。

Java 9には、デフォルトの実装を提供するインターフェース メソッドで使用された共通コード ロジックをカプセル化するために使用できる、インターフェース内のプライベート メソッドさえあります。

于 2015-09-25T04:35:16.820 に答える
19

これらの 2 つはまったく異なります。

デフォルトのメソッドは、状態を変更せずに既存のクラスに外部機能を追加することです。

また、抽象クラスは通常のタイプの継承であり、拡張を目的とした通常のクラスです。

于 2013-11-15T10:25:52.317 に答える
9

Java インターフェイスのデフォルト メソッドにより、インターフェイスの進化が可能になります。

既存のインターフェースに、古いバージョンのインターフェースとのバイナリ互換性を損なうことなくメソッドを追加したい場合は、2 つのオプションがあります。デフォルトまたは静的メソッドを追加することです。実際、インターフェースに追加された抽象メソッドは、このインターフェースを実装するクラスまたはインターフェースによって実装される必要があります。

静的メソッドはクラスに固有です。デフォルト メソッドは、クラスのインスタンスに固有です。

デフォルト メソッドを既存のインターフェイスに追加する場合、このインターフェイスを実装するクラスおよびインターフェイスは、それを実装する必要はありません。彼らはできる

  • デフォルトのメソッドを実装し、実装されたインターフェイスの実装をオーバーライドします。
  • 抽象化するメソッドを(実装なしで)再宣言します。
  • 何もしません (その場合、実装されたインターフェースのデフォルト メソッドは単純に継承されます)。

トピックの詳細はこちら.

于 2015-06-23T11:36:40.727 に答える
2

デフォルトメソッドとのインターフェースをいつ使用し、いつ抽象クラスを使用する必要がありますか?

下位互換性: インターフェースが何百ものクラスによって実装されていると想像してください。そのインターフェースを変更すると、インターフェースを実装する他の多くのクラスにとって必須ではない場合でも、すべてのユーザーが新しく追加されたメソッドを強制的に実装することになります。さらに、インターフェースを許可します。機能的なインターフェースになる

事実と制限:

1-インターフェイス内でのみ宣言でき、クラスまたは抽象クラス内では宣言できません。

2-ボディを提供する必要があります

3-インターフェイスで使用される他の通常のメソッドのように抽象的であるとは想定されていません。

于 2016-08-05T17:01:49.990 に答える