java - 与现有抽象类 Clock 相比,新接口 java.time.InstantSource 的主要目的是什么?
问题描述
Java 17 中添加了一个新接口java.time.InstantSource
。如果该接口的所有实现也是实现,那么该附加抽象的用例是Clock
什么?
解决方案
感谢 NoDataFound 提供评论中的链接(链接在此答案的底部重复)。Stephen Colebourne(java.time 的原始开发者)的“错误”报告说:
问题
自从 java.time 在 Java 8 中首次添加以来,很明显缺少一个概念 - 独立于时区的 Instant 的来源。简而言之,如果您唯一需要的是 Instant,那么 Clock 就不是正确的 API,因为它迫使您考虑时区。
一个好的基于时间的代码的架构设计将在操作系统时钟的抽象(为单元测试注入的依赖项)和与用户本地化相关的时区之间进行分离。分别传递这两件事是关键。为了实现这一点,开发人员必须编写自己的 TimeSource 或 InstantSource 接口,或者使用 Clock 并“捏住鼻子”来忽略其中的时区。
A
Supplier<Instant>
显然执行类似的功能,但它缺乏可发现性和可理解性。另外,注入通用接口往往很痛苦。
用我的话来说:该Clock
课程是作为当前时间的来源而引入的。从概念上讲,当前时间的来源应该与时区无关。尽管如此,它Clock
还是有一个时区。可能出于实际目的,以便您可以从中绘制各种日期时间对象:LocalDate
, ZonedDateTime
,LocalTime
等。
InstantSource
问的界面实现了我刚才描述的时钟概念:一个独立于时区的当前时间的来源。当带有时区的时钟对您的目的来说太重时。
Clock
两者的目的之一InstantSource
是可测试性:通过这些,您可以控制在运行测试时哪个时间被认为是“当前时间”,当您想要可重复的测试时,这通常是必需的。
...如果无论如何该接口的所有实现也是时钟实现?
我还没有检查InstantSource
Java 17 附带的所有实现是否都是Clock
子类。即使是这种情况,(1)这不是重点,并且(2)没有人阻止你实现一个InstantSource
不是Clock
. 抽象是编程中的一个关键概念。如果你只想要Instant
s,那么你想针对一个只能给你Instant
s 的简单接口进行编程。InstantSource
抽象出您正在使用的对象也能够Clock
在其他上下文中扮演 a 的角色这一事实。该InstantSource
界面是应用备受推崇的 Façade 设计模式的学校示例(链接如下)。借助 Stephen Colebourne 来自 bug 系统的描述性文字,该界面使程序员在获取Instant
s.
链接
- 在 OpenJDK 错误系统中添加 java.time.InstantSource 。
- 维基百科上的立面图案。
推荐阅读
- javascript - 具有非规则间隔的 ChartJS 横坐标
- windows - Flutter SDK windows升级 - 访问被拒绝,未找到Cookie
- azure-sql-database - 接受来自 adf 管道中 sql 表的参数
- yocto - do_rootfs 中的 bitbake 错误:systemd 依赖于 update-rc.d
- azure - Azure 事件中心异地恢复:故障转移期间主区域上的未读数据会发生什么情况?
- python - 将json数据递归添加到json对象python
- docker - 我正在将 Apache 超集从 0.36.0 升级到 1.0.0,升级后我遇到错误,我正在使用外部数据库
- log4j - Hybris:如何在同一扩展名中创建单独的 log4j 日志文件
- javascript - React native:如何将类组件代码变成带有钩子的函数组件?
- c# - C#如何检测每个微服务 API 中的 crud 操作并将它们发布到rabbitMQ?