web-dev-qa-db-ja.com

Java 8:仮想拡張メソッドと抽象クラス

私はJava 8インターフェイスで新しい仮想拡張メソッドを見ています:

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

インターフェイスを時間の経過とともに進化させ、多重継承ビットを使用できるようにすることを目的としていますが、私には抽象クラスのように見えます。

新しい作業をしている場合、「インターフェース」への実装を提供するために拡張メソッドよりも抽象クラスが好まれますか、それともこれら2つのアプローチは概念的に同等ですか?

28
Kong

このような構成の主な目的の1つは、下位互換性を維持することです。 Java言語へのクロージャの追加は非常に大きな変更であり、これを十分に活用するには、更新する必要があります。たとえば、 Collection in Java 8には、ラムダと連携して機能するforEach()などのメソッドがあります。このようなメソッドを既存のCollectionインターフェイスに追加するだけで後方互換性が損なわれるため、実行可能ではありません。Java 7 Collectionを実装するクラスは、これらのメソッドがないため、コンパイルされなくなります。したがって、これらのメソッドは「デフォルト」の実装で導入されました。Scalaを知っている場合は、Java interfacesがScala traits。

インターフェイスと抽象クラスに関しては、2つはまだ異なるJava 8;あなたはまだ持つことはできませんたとえば、インターフェイスのコンストラクタ。したがって、2つのアプローチ自体は「概念的に同等」ではありません。抽象クラスはより構造化されており、状態を関連付けることができますが、インターフェイスはできません。 Java 7以下で行うのと同じように、プログラムのコンテキスト。

33
arshajii
  1. 抽象クラ​​スはラムダ式のルートクラスにすることはできませんが、インターフェイス仮想拡張メソッドを使用することはできます。
  2. 抽象クラ​​スコンストラクターとメンバー変数を持つことができますが、インターフェイスにはできません。可能なコンストラクターの実行と、抽象クラスがラムダ式のルートになることを禁止するチェック済み例外のスローの可能性があると思います。

ユーザーがラムダ式を使用できるようにするAPIを作成する場合は、代わりにインターフェースを使用する必要があります。

5
aepurniet

いくつかの一般的な動作(メソッド)を提供するために、抽象クラス状態を保持(インスタンスフィールド)。
通常(これまで?)状態のない抽象クラスは表示されません。

インターフェイス機能を指定。それらは、動作を実装するのではなく、契約として宣言することを目的としています。
したがって、インターフェースの一部として指定されているメソッドはすべて「ヘルパー」メソッドであり、実装には影響しません。

5
Mehrdad

抽象クラスと機能インターフェイスの違いは、通常のインターフェイスと抽象クラスのすべての違いに似ていますが、メジャーの違いは、機能インターフェイスにはデフォルトのメソッドを含めることができますが、抽象クラスにはできないことです。これが変更され、Java 8 foreach()およびラムダを使用したその他のパフォーマンスメソッド

package com.akhi;
public abstract class AbstractDemo {
abstract void letsRun(); // abstract valid
public String toString(); // invalid but valid in interface or functional interface

public boolean equals(Object o); // invalid but valid in interface or functional interface

public int concrete() { // Concrete is invalid in interface
    return 1;
}

public default int getMult(int a, int b) // default invalid but valid in case of functional
{
    return a * b;
}

public static int getSum(int a, int b) // static allowed
{
    return a + b;
}
}
 </ code>
0
Akhilesh

抽象クラ​​ス 以下の領域のJava-8インターフェースのスコア。

  1. 抽象クラスを使用すると、静的および最終ではないフィールドを宣言し、パブリック、プロテクト、およびプライベートの具象メソッドを定義できますインターフェイスでは、すべてのフィールドが自動的にpublic、static、finalになり、宣言または定義するすべてのメソッド(デフォルトのメソッドとして)はpublicになります。

  2. 可変状態は、定数のみを持つインターフェイスとは異なり、子クラスと共有/変更できます

  3. 抽象クラスを使用して実装できます Template_method_pattern :操作のアルゴリズムのプログラムスケルトンを定義し、いくつかのステップをサブクラス。
  4. 抽象クラスを使用して実装できます Decorator_pattern :動作を個々のオブジェクトに静的に追加できるようにするデザインパターンまたは動的に、同じクラスの他のオブジェクトの動作に影響を与えません。
0
Ravindra babu