3

インターフェイスDelayedには、

このインターフェイスの実装は、その getDelay メソッドと一致する順序を提供するcompareToメソッドを定義します。

しかし、Java 8 にデフォルトの実装がないのはなぜでしょうcompareTogetDelay

これが実装クラスに残されている特定の理由はありますか? それとも、スーパーインターフェイスを上書きするときにデフォルトメソッドを作成することはできませんか?

編集:私の質問をより理解しやすくするために、ここに例を示します:

interface Delayed extends Comparable<Delayed> {

    long getDelay(TimeUnit unit);

    @Override
    default int compareTo(Delayed o) {
      // might not be the perfect "compareTo" implementation, but you get the point
      return o == this? 0:
        Long.compare(this.getDelay(TimeUnit.NANOSECONDS), o.getDelay(TimeUnit.NANOSECONDS);
    }

}
4

1 に答える 1

5

簡単な答えは、それDelayedは 1.5 からdefault存在し、メソッドは 1.8 から存在するというものです。したがって、compareToメソッドをメソッドとして提供するdefaultには、インターフェイスを意図的に変更する必要があります。

そうでない場合は、いくつかの理由が考えられます。

  • 誰もそれを考えたことがなかったのかもしれません
  • 考慮されたが、次のいずれかの理由で削除された可能性があります。

    • 互換性の問題が発生する可能性があります
    • API の変更を正当化するほど、期待されるメリットが高くない
    • 発売前にやるべき優先事項があった

私には、優先度の高い問題のようには見えません。ほとんどの場合、JRE によって提供されるDelayedのコンテキストで実装に遭遇しますがScheduledExecutorService、これらの実装は既に存在するため、そのような変更によるメリットはありません。

アプリケーションコードでカスタム実装に遭遇することはあまりないと思いますがDelayed、たとえそれが異なっているように見えたとしても、JRE 開発者は明らかに、有用性がより明白な (または議論の余地の少ない) 追加に焦点を当てることを決定しました。


考えてみれば、契約と合わせた契約についての議論を盛り込んで、まったく延長しないほうがよかったのです。結局のところ、または同様のデザイン パターンを使用して、オブジェクトをプロパティで並べ替えるのは難しくありません。getDelay()ComparableDelayedComparableComparator

于 2015-11-25T14:56:02.710 に答える