我正在考虑使用Joda-Time。
我想知道我是否应该注意我的接口返回的对象类型。
从我在服务层的接口签名中返回 Joda-Time 对象意味着使用它的每个模块都将依赖于 Joda-Time 而不是常见的java.util.Date API。
您是在 App 模块周围传递 Joda 对象,还是在应用程序的特定部分编写包装器?
4 回答
什么是替代方案?将 jodaTime 对象转换为臭名昭著的日历/日期对象?
您选择摆脱这些对象,这是一个不错的决定。现在,如果您让其他层使用 java date API,它们将进入您使用 jodaTime 消除的那种错误和无意义的行为。
我认为您应该帮您的用户一个忙,让他们使用 jodaTime。
当然,这是一个设计决定,会在他们的代码中添加对 jodaTime 的依赖,但我认为这没有问题,因为您选择 jodaTime 来编写更少更好的代码,他们也应该如此。
一开始,只返回最合适的类型(本例中为 Joda Objects)。
如果您得知有人对此有问题(这可能不会经常发生),请在接口中添加一个转换器方法(例如,getTime()
现在您有,getJavaTime()
或者getTimeInMillis()
)。
或者添加一个通用的辅助方法,它接受一个对象(您可以将未知实例视为Object
代码中的任何地方,而不必导入实际的 Joda 类)并返回一个普通的 Java 对象(java.util.Date
)。
根据您期望客户端库对您的 api 执行的操作,您可以选择仅使用毫秒时间戳。所有其他都是可能值得或可能不值得传递的表示。如果您的库旨在以人类可理解的方式帮助表示日期和时间,请使用 Joda,它在 Java8 中的工作方式可能大致相同。如果您的图书馆更喜欢计算日期,只需以毫秒为单位交换时间,然后让客户使用他们喜欢的任何东西。
现在:乔达时间
尽可能使用Joda-Time。在需要与其他不熟悉 Joda-Time 的类交换数据的地方转换为 java.util.Date。
要从java.util.Date转到org.joda.time.DateTime,请将 Date 传递给 DateTime 构造函数:
DateTime myDateTime = new DateTime( myDate );
要从 DateTime 转到 Date,请调用以下toDate
方法:
Date myDate = myDateTime.toDate();
未来:JSR 310
Java 8 带来了由 JSR 310 定义的 java.time.* 类。这些类受到 Joda-Time 的启发,但完全重新架构。
如果您的项目仅在 Java 8 或更高版本中使用,请使用这些而不是 Joda-Time。Joda-Time 在旧版本的 Java 上仍然有用,并且 Joda-Time 仍在维护中。但是 java.time.* 类旨在取代 Joda-Time 和 java.util.Date/Calendar 类。
随着其他类和框架的更新以用 java.time.* 替换它们对 java.util.Date/Calendar 的使用,您的问题最终将变得毫无意义。