2016-03-31 1 views
15

私はJavaを学んでいるだけなので、可能な選択肢やそのような設計の決定に影響することは難しいです。Java 8のインタフェースにデフォルトのメソッドを追加するのはなぜ良い選択であり、何が選択肢なのですか

のJava 8は、インタフェースが実装を有することを可能にするインターフェースへデフォルトメソッド機能を追加します。 これにより、クライアントを壊すことなく新しい方法で既存のインターフェイスを拡張し、下位互換性のある方法で時間をかけてインターフェイスを展開することができます。 しかし、既定の実装では、このような拡張は幾分制限されており、インターフェイスまたはライブラリメソッドの既存のインターフェイスメソッドを使用して実装される可能性があります。 私の質問は

  • なぜこの言語機能が導入されたのですか?
  • どのような主な新機能がサポートされていますか? (Splititeratorsなど)
  • これらの言語機能をサポートするために他にどのような方法がありましたか?例えば、Iterableを継承する新しいインタフェースSplitIterableを作成しないでください。
  • これらの代替案を実装した場合の影響(インターフェイスの徹底化)
  • 他のメソッドのコンポジションとしてインプリメントすることが可能な場合、インタフェースの第1版のメソッドのデフォルト実装を提供する必要がありますか?
+3

すてきな質問です。個人的に私はこのアイデアが嫌いで、インターフェイスはまさにそうだと思う。つまり実装が全くない。 – Bathsheba

+3

[Streaming API](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)関連のメソッドをコレクションに導入できるように追加されましたコレクションインターフェイスのカスタム実装を壊すことなく –

+2

Brian Goetzの論文[「public defender」メソッドによるインターフェイスの進化](http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v3.pdf)および関連するスタックオーバーフローに関する質問["Java 8のデフォルトメソッドはソースの互換性を損なっていますか?"](http://stackoverflow.com/questions/31188231)。 –

答えて

10

なぜこの言語機能が導入されましたか?

それは、「垂直」とは対照的に(同じインタフェースを実装するクラス全体で「水平に」あなたはすべての人のコードを壊すことなく、すでに使用されている既存のインタフェースにメソッドを追加できるようにするだけでなく、メソッドの実装を共有するために、主に追加されました継承を介して共有する)。

どのような新機能がサポートされていますか?これらの言語機能をサポートするためにあった、他にどのような選択肢(例えばSplititerators用)

java.util.Collection<T>.stream()

?たとえば、Iterableを拡張する新しいインターフェイスSplitIterableを作成しないでください。

あなたは全く新しいインターフェースを選ぶ、および関連する静的ヘルパークラス(例えばCollection<T>インターフェースとそのCollectionsヘルパークラス)で続けることができます。これは恐ろしいことではないでしょう - 実際、デフォルトのメソッドは純粋に静的メソッドの上に構文的な砂糖であると主張できます*。ただし、デフォルトの方法では一般的に読みやすさが向上します。

(?インタフェースの増殖を)これらの選択肢を実装の影響だろう

あなたはあまり一貫性のライブラリーで終わる、と読みにくく言語が、それはないだろうだろうか

世界の終わり。Joachim Sauerで指摘されているように、インタフェースの実装では、スタティックヘルパークラスからの実装をオーバーライドできないという大きな懸念があります。それは柔軟性を失うだろう。

他のメソッドのコンポジションとしてインプリメントすることが可能な場合、インタフェースの第1版のメソッドのデフォルト実装を提供する必要がありますか?

"水平方向に"実装を共有する必要がある場合のみ実行してください。メソッドが実装の本質的な振舞いを提供する場合、メソッドのデフォルトを指定しないでください。

*デフォルトの方法は仮想のままであるため、これは単純すぎることになります。コメントはBrian Goetzに感謝します。

+4

静的ヘルパーメソッドとデフォルトメソッドの大きな違いは、サブクラス/実装者がデフォルトのメソッドをより良い実装に置き換えるメソッド。 Collectionサブクラスではこれが実際には非常に一般的です。 –

+1

インターフェイスの横にヘルパークラスを持つ利点の1つは、実装する必要があるインターフェイスの必須メソッドとヘルパーメソッドの間の明確な区別です。これは必須メソッドの構成に過ぎません。 ヘルパーメソッドをインターフェイスの中に置くことによって、実装者が実際にヘルパーメソッドを実装することを提案しています。 ちなみに、C#の拡張メソッドは、ヘルパークラスの不便さを隠す便利な方法です。 – ironstone13

+4

Javaのデフォルトメソッドは_virtual_と_declaration-site_です(C#の拡張メソッドではなく、_static_と_use-site_です)。サブクラスはより良い実装でオーバーライドできます。 declaration-siteでは、APIの設計者は、APIの制御を維持しながら、公開後にAPIを拡張することができます。 –

関連する問題