【问题标题】:How to use abstraction with classes LocalDate and LocalDateTime?如何使用类 LocalDate 和 LocalDateTime 的抽象?
【发布时间】:2022-01-06 02:02:24
【问题描述】:

我有以下代码:

LocalDate date;
LocalDate minDate;

//constructor...

if(date.isBefore(minDate)){
   throw new RuntimeException();
}

与 LocalDateTime 类似:

LocalDateTime date;
LocalDateTime minDate;

//constructor...

if(date.isBefore(minDate)){
   throw new RuntimeException();
}

我可以使用一些接口或抽象类,这样我就不必编写两次相同的代码了吗?我找不到这样的接口。 如您所见,我只使用 'isBefore' 和 'isAfter' 方法。

【问题讨论】:

  • 请添加更多上下文!您从哪里获得日期和时间?
  • Comparable 怎么样?

标签: java dry


【解决方案1】:

这些类共享更通用的类型,例如Temporal。但它们是应用开发者普遍使用的。

并且那些更通用的类型不共享isBefore/isAfter 方法。

我认为您被巧合命名的方法所愚弄,认为这些日期时间类只是彼此的变体。但他们不是。 LocalDateLocalDateTime 真的是不同的动物。因此,关于您的 DRY 标签,您实际上并没有在这里重复自己。试图抽象出仅日期和日期与时间之间的区别是无效的。

相比之下,请注意LocalDate 如何实现更通用的接口ChronoLocalDateisBefore/isAfter 方法的来源。该接口在 Java 中的五个类(HijrahDate、JapaneseDate、LocalDate、MinguoDate、ThaiBuddhistDate)和 ThreeTen-Extra 项目中的更多类之间共享。这些类是同一种动物,有多种方法可以识别日历上的每个日期。对于这些类,将所有这些类抽象为 ChronoLocalDate 在逻辑上是合适的,并且(显然)对 java.time 框架很有用。

请注意,我并不是建议在您的应用中使用 ChronoLocalDate。 Javadoc 作为一般规则明确警告我们不要使用这种用法。我只是想表明仅日期类是“相同的”,而仅日期类和带有时间的日期类则不是。

【讨论】:

  • 我完全同意。问题中的两个 sn-ps 确实有相似之处,但看起来比它们更相似,因为 LocalDateTime 被错误命名为 date。应该是dateTime。如果字段的类型为Integer 并且检查为integer < minInteger,则相似性将保持不变。试图抽象出这种相似性没有任何好处,只会造成不必要的复杂化。
【解决方案2】:

即时。 LocalDate 和 LocalDateTime 都可以转换为 Instant。

【讨论】:

  • 完全不正确。 Instant 代表时刻,时间线上的特定点。 LocalDateLocalDateTime 都不代表片刻。要到达某个时刻,您必须添加信息、一天中的时间和/或时区,这些信息尚不存在。
  • 它不能正常工作,因为我每次都需要解析
  • 这确实是一个错误的答案。对于那个很抱歉。我看到了您对“Instant 和 LocalDateTime 之间的区别”问题的回答。我得到了很多,谢谢 Basil Bourque。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2019-04-23
  • 2017-11-25
  • 2014-05-24
  • 1970-01-01
  • 2019-01-11
  • 2021-08-10
相关资源
最近更新 更多