0

仮想拡張メソッド (既定のメソッド) に関する公式声明では、次のように述べられています。

仮想拡張メソッド (既定のメソッド) の目的は、最初の公開後にインターフェイスを互換性のある方法で進化させることです。」</p>

これが実際に行われている JDK の良い例を見ることはできますか? これまでのところ、java.util.Collectionインターフェイスと他のいくつかを見つけましたが、より完全なリストがあると便利です.

編集:デフォルトの方法を使用することが安全かどうかを調べていませんでした(リンクされている質問をすでに読んでいるため)。JDKで実用的な例を探していました。

4

1 に答える 1

3

コレクションを超えて私が知っている標準クラスにはいくつかの場所があります。

  • Java SQL API のインターフェースが強化されました。ResultSet.updateObjectPreparedStatement.setObject、 ( ではなく戻るPreparedStatement.executeLargeUpdateとは異なります) などが追加されました。デフォルトでは、それらはスローまたはその他の例外をスローします。これが「インターフェースの進化」です。古いインターフェースを新しい機能で強化する方法です。executeUpdatelongintUnsupportedOperationException

  • の関数にjava.util.functionは、それらを組み合わせることができるデフォルトのメソッドがあります。これらのメソッドが再定義されることは想定されていません。関数型インターフェイスは主にラムダで動作することを目的としているためです。これらのメソッドは便宜上のものです。これらのインターフェースは Java 8 で最初に登場したため、これは「インターフェースの進化」ではありません。ただし、これらのメソッドがデフォルトではない場合、単一抽象メソッドのルールに違反するため、これらのインターフェースをラムダで表現することはできません。

  • java.util.Comparator:reversed()などにいくつかのデフォルト メソッドが追加されましthenComparing()た。また、デフォルトの実装は問題なく、通常は置き換えられることを意図していません。これは関数に似ていますが、Comparatorインターフェースは以前から存在していたので、一種のインターフェースの進化でもあります。

  • java.util.Spliteratorインターフェイスにはデフォルトのメソッドがあります。さまざまな目的のデフォルトのメソッドがここに示されているため、これは実際には良い例です。メソッドはgetComparator()デフォルトでスローしますが、スプリッテレータが特性を使用する場合はオーバーライドする必要がありますSORTED。このhasCharacteristic()メソッドは、デフォルト以外のメソッドを使用するための便利なcharacteristics()方法であり、おそらく再定義するべきではありません。デフォルトのforEachRemaining()実装は常に正しく機能しますが、それをオーバーライドすると、一部のスプリッテレータでより効果的な結果が得られる場合があります。デフォルトのgetExactSizeIfKnown()実装も常に正しく、通常は再定義する必要はありません。ただし、スプリッテレータのサイズが変更されていない場合は、 を返すだけで少し最適化できます-1

于 2015-08-03T12:28:12.073 に答える