相对于现有的抽象类 Clock,新接口 java.time.InstantSource 的主要目的是什么?

Оле*_*ник 9 java java-time java.time.instant

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

Ole*_*.V. 11

感谢 NoDataFound 在评论中提供的链接(链接在此答案的底部重复)。Stephen Colebourne(java.time 的原始开发者)在 \xe2\x80\x9cbug\xe2\x80\x9d 报告中说道:

\n
\n

问题

\n

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

\n

基于时间的代码的良好架构设计应该在操作系统时钟的抽象(为单元测试注入的依赖性)和链接到用户本地化的时区之间进行分离。分别传递这两件事是关键。为了实现这一点,开发人员必须编写自己的 TimeSource 或 InstantSource 接口,或者使用 Clock 并“保持其姿势”以忽略其中保留的时区。

\n

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

\n
\n

用我的话说:该Clock课程是作为当前时间的来源引入的。从概念上讲,当前时间的来源应该独立于时区。但Clock仍然有一个时区。可能出于实际目的,以便您可以从中绘制各种日期时间对象:LocalDateZonedDateTimeLocalTime等。

\n

所询问的接口InstantSource实现了我刚才描述的时钟概念:独立于时区的当前时间源。当带时区的时钟对于您的目的来说太重时。

\n

Clock两者的目的之一InstantSource是可测试性:使用它们,您可以控制运行测试时将哪个时间视为 \xe2\x80\x9c 当前时间 \xe2\x80\x9d ,当您想要可重现的测试时,这通常是必需的。

\n
\n

\xe2\x80\xa6 是否该接口的所有实现都是 Clock\n 实现?

\n
\n

我还没有检查过InstantSourceJava 17 附带的所有实现是否都是Clock子类。即使是这种情况,(1)这不是重点,(2)\xe2\x80\x99s 没有人阻止你实现一个InstantSource不是Clock. 抽象是编程中的一个关键概念。如果您只想要Instants,那么您希望针对一个只能提供Instants 的简单接口进行编程。InstantSource抽象出这样一个事实:您正在使用的对象也能够Clock在其他上下文中播放 a 的 r\xc3\xb4le 。该InstantSource界面是应用备受推崇的 Fa\xc3\xa7ade 设计模式的学校示例(链接如下)。借助来自 bug 系统的 Stephen Colebourne\xe2\x80\x99s 描述性文字,该接口将程序员从 \xe2\x80\x9e 中解放出来,同时获取Instants。

\n

链接

\n\n

  • 有趣的是 - 对于 NodaTime,我们的“IClock”接口相当于“InstantSource”...然后我们有一个“ZonedClock”类,为了方便起见,它接受“IClock”和“IDateTimeZone”。 (2认同)