Java 8では、インターフェイスに実装メソッド、静的メソッド、いわゆる「デフォルト」メソッド(実装クラスがオーバーライドする必要はありません)を含めることができます。
私の(おそらく素朴な)見解では、このようなインターフェースに違反する必要はありませんでした。インターフェイスは常にあなたが満たさなければならない契約であり、これは非常にシンプルで純粋な概念です。今では、いくつかのものが混在しています。私の考えでは:
- 静的メソッドはインターフェイスに属しません。これらはユーティリティクラスに属します。
- 「デフォルト」メソッドはインターフェースでまったく許可されるべきではありません。この目的には常に抽象クラスを使用できます。
要するに:
Java 8より前:
- 抽象クラスと通常クラスを使用して、静的メソッドとデフォルトメソッドを提供できます。インターフェイスの役割は明確です。
- クラスを実装することにより、インターフェイス内のすべてのメソッドをオーバーライドする必要があります。
- すべての実装を変更せずにインターフェイスに新しいメソッドを追加することはできませんが、これは実際には良いことです。
Java 8以降:
- インターフェースと抽象クラス(多重継承を除く)には実質的に違いはありません。実際、インターフェイスを使用して通常のクラスをエミュレートできます。
- 実装をプログラミングするとき、プログラマはデフォルトのメソッドをオーバーライドするのを忘れることがあります。
- クラスが同じシグネチャを持つデフォルトメソッドを持つ2つ以上のインターフェイスを実装しようとすると、コンパイルエラーが発生します。
- インターフェイスにデフォルトのメソッドを追加することにより、実装するすべてのクラスがこの動作を自動的に継承します。これらのクラスの一部は、その新しい機能を念頭に置いて設計されていない可能性があり、これにより問題が発生する可能性があります。たとえば、誰かが新しいデフォルトのメソッド
default void foo()
をinterfaceIx
に追加すると、同じシグネチャを持つプライベートメソッドをCx
実装Ix
しているクラスfoo
はコンパイルされません。
このような大きな変更の主な理由は何ですか?また、追加された新しいメリット(ある場合)は何ですか?
@Deprecated
カテゴリに属します!静的メソッドは、無知と怠のために、Javaで最も悪用される構成要素の1つです。静的メソッドの多くは通常、無能なプログラマーを意味し、結合を数桁増加させます。そして、なぜそれらが悪い考えであるかを理解すると、単体テストとリファクタリングに悪夢です!