首页 > 解决方案 > 与现有抽象类 Clock 相比,新接口 java.time.InstantSource 的主要目的是什么?

问题描述

Java 17 中添加了一个新接口java.time.InstantSource。如果该接口的所有实现也是实现,那么该附加抽象的用例是Clock什么?

标签: javajava-timejava.time.instant

解决方案


感谢 NoDataFound 提供评论中的链接(链接在此答案的底部重复)。Stephen Colebourne(java.time 的原始开发者)的“错误”报告说:

问题

自从 java.time 在 Java 8 中首次添加以来,很明显缺少一个概念 - 独立于时区的 Instant 的来源。简而言之,如果您唯一需要的是 Instant,那么 Clock 就不是正确的 API,因为它迫使您考虑时区。

一个好的基于时间的代码的架构设计将在操作系统时钟的抽象(为单元测试注入的依赖项)和与用户本地化相关的时区之间进行分离。分别传递这两件事是关键。为了实现这一点,开发人员必须编写自己的 TimeSource 或 InstantSource 接口,或者使用 Clock 并“捏住鼻子”来忽略其中的时区。

ASupplier<Instant>显然执行类似的功能,但它缺乏可发现性和可理解性。另外,注入通用接口往往很痛苦。

用我的话来说:该Clock课程是作为当前时间的来源而引入的。从概念上讲,当前时间的来源应该与时区无关。尽管如此,它Clock还是有一个时区。可能出于实际目的,以便您可以从中绘制各种日期时间对象:LocalDate, ZonedDateTime,LocalTime等。

InstantSource问的界​​面实现了我刚才描述的时钟概念:一个独立于时区的当前时间的来源。当带有时区的时钟对您的目的来说太重时。

Clock两者的目的之一InstantSource是可测试性:通过这些,您可以控制在运行测试时哪个时间被认为是“当前时间”,当您想要可重复的测试时,这通常是必需的。

...如果无论如何该接口的所有实现也是时钟实现?

我还没有检查InstantSourceJava 17 附带的所有实现是否都是Clock子类。即使是这种情况,(1)这不是重点,并且(2)没有人阻止你实现一个InstantSource不是Clock. 抽象是编程中的一个关键概念。如果你只想要Instants,那么你想针对一个只能给你Instants 的简单接口进行编程。InstantSource抽象出您正在使用的对象也能够Clock在其他上下文中扮演 a 的角色这一事实。该InstantSource界面是应用备受推崇的 Façade 设计模式的学校示例(链接如下)。借助 Stephen Colebourne 来自 bug 系统的描述性文字,该界面使程序员在获取Instants.

链接


推荐阅读