Java 8 インターフェイスのデフォルト メソッドと抽象クラスの非抽象メソッド - 2 つの間に違いはありますか (iface の違い以外に、クラス、可視性など)。
デフォルトのメソッドは Java の一歩後退ではありませんか? つまり、Java が何年も宣伝してきた本質に反していますか?!
Java 8 インターフェイスのデフォルト メソッドと抽象クラスの非抽象メソッド - 2 つの間に違いはありますか (iface の違い以外に、クラス、可視性など)。
デフォルトのメソッドは Java の一歩後退ではありませんか? つまり、Java が何年も宣伝してきた本質に反していますか?!
心に留めておくべき重要なことは、デフォルトのメソッドは状態にアクセスできず、振る舞いだけにアクセスできるということです。実際には、合理的でデフォルトの動作を定義するのに最適な場所です。
インターフェースがあると想像してください:
public interface Plant {
enum Pace { FAST, SLOW; }
void grow(Pace pace);
void growFast();
void growSlow();
}
デフォルトの動作を提供することは合理的と思われます。
default void growFast() { grow(Pace.FAST); }
default void growSlow() { grow(Pace.SLOW); }
これは単純な例ですが、デフォルトのメソッドがどのように役立つかを示しています。この場合、方法growSlow
またはgrowFast
動作はインターフェイス コントラクトの一部であるため、インターフェイス レベルで動作を定義することは理にかなっています。
ただし、インターフェースは、「植物を育てる」というアクションがどのように実装されるかについては想定していません。これは、抽象クラスで定義できます。
大きな違いは、コンストラクターを匿名クラスで実行できる可能性があり、チェック済みの例外がある可能性があることです。これにより、匿名クラスが関数型インターフェイスになるのを防ぎ、ラムダ式の基礎として使用できなくなります。
まず、デフォルトのメソッドを使用すると、既存の実装を壊すことなく、インターフェイスに新しいメソッドを追加できます。
また、インターフェイス権限Collections
のユーティリティ クラスであるクラスの例を見てみましょう。Collection
したがって、デフォルトのメソッドを使用して、すべてのユーティリティ メソッドをデフォルトの実装としてCollection
それ自体に移動できるようになりました。これは、そのようなユーティリティ用に別のクラスを作成するよりも理にかなっています。
abstract
また、プレーンなクラスでは実現できなかった、複数のインターフェースからメソッドを継承することもできます。
主な違いは次のとおりです。インターフェースの Java 8 デフォルト メソッドは public ですが、抽象クラスの非抽象 (具象) メソッドは、public、protected、または private として定義できます。ラムダ式は Java 8 で導入されました。ラムダ機能を使用するには (下位互換性を維持するために) デフォルトのメソッドが必要です。抽象クラスの非抽象メソッドは目的を果たすことができません。