为什么 Delayed 不为 compareTo 提供默认方法?
Why doesn't Delayed provide a default method for compareTo?
接口Delayed需要任何
implementation of this interface [to] define a compareTo method that provides an ordering consistent with its getDelay method.
不过我想知道,为什么 Java 8 中没有默认实现,因为合同要求 compareTo
仅依赖于 getDelay
.
是否有特定原因将其留给实施 class?还是覆盖超接口时无法创建默认方法?
编辑:为了让我的问题更容易理解,这里有一个例子:
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);
}
}
简单的答案是 Delayed
自 1.5 以来存在,而 default
方法自 1.8 以来存在。因此,为了将 compareTo
方法提供为 default
方法,必须故意 更改接口 .
如果没有发生,可能有以下几种原因:
- 可能根本没有人考虑过它
可能考虑过但放弃了,因为:
- 可能存在兼容性问题
- 预期收益不足以证明API改变
- 发布前有优先级更高的事情要做
对我来说,这看起来不像是一个高优先级的问题。大多数时候,您会在 JRE 提供的 ScheduledExecutorService
上下文中遇到 Delayed
实现,这些实现已经存在,因此不会从此类更改中受益。
我认为您不会经常在应用程序代码中遇到自定义 Delayed
实现,但即使您看到它不同,JRE 开发人员显然决定专注于有用性更明显的添加(或较少商榷)。
考虑一下,将 关于 getDelay()
合同与 Comparable
合同结合起来,如果 Delayed
从未延长 [=18] 会更好=] 完全没有。毕竟,使用 Comparator
或类似的设计模式按 属性 对对象进行排序并不难。
接口Delayed需要任何
implementation of this interface [to] define a compareTo method that provides an ordering consistent with its getDelay method.
不过我想知道,为什么 Java 8 中没有默认实现,因为合同要求 compareTo
仅依赖于 getDelay
.
是否有特定原因将其留给实施 class?还是覆盖超接口时无法创建默认方法?
编辑:为了让我的问题更容易理解,这里有一个例子:
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);
}
}
简单的答案是 Delayed
自 1.5 以来存在,而 default
方法自 1.8 以来存在。因此,为了将 compareTo
方法提供为 default
方法,必须故意 更改接口 .
如果没有发生,可能有以下几种原因:
- 可能根本没有人考虑过它
可能考虑过但放弃了,因为:
- 可能存在兼容性问题
- 预期收益不足以证明API改变
- 发布前有优先级更高的事情要做
对我来说,这看起来不像是一个高优先级的问题。大多数时候,您会在 JRE 提供的 ScheduledExecutorService
上下文中遇到 Delayed
实现,这些实现已经存在,因此不会从此类更改中受益。
我认为您不会经常在应用程序代码中遇到自定义 Delayed
实现,但即使您看到它不同,JRE 开发人员显然决定专注于有用性更明显的添加(或较少商榷)。
考虑一下,将 getDelay()
合同与 Comparable
合同结合起来,如果 Delayed
从未延长 [=18] 会更好=] 完全没有。毕竟,使用 Comparator
或类似的设计模式按 属性 对对象进行排序并不难。