3

接口延迟需要任何

此接口的实现 [to] 定义一个compareTo方法,该方法提供与其 getDelay 方法一致的排序。

但是我想知道,为什么 Java 8 中没有默认实现,因为compareTo合同要求完全依赖getDelay.

是否有特定原因将其留给实现类?还是在覆盖超级接口时无法创建默认方法?

编辑:为了让我的问题更容易理解,这里有一个例子:

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的 s 上下文中遇到实现,ScheduledExecutorService并且这些实现已经存在,因此不会从此类更改中受益。

我认为您不会Delayed经常在应用程序代码中遇到自定义实现,但即使您看到它不同,JRE 开发人员显然决定专注于有用性更明显(或不太值得商榷)的添加。


想一想,把关于合同的讨论getDelay()和合同结合起来Comparable,如果Delayed不延长就好Comparable了。毕竟,使用Comparator或类似的设计模式按属性对对象进行排序并不难。

于 2015-11-25T14:56:02.710 回答