在Spring Framework上使用LocalDate进行重复计算的最佳实现是什么?

时间:2017-10-08 15:42:48

标签: java spring spring-mvc java-8 localdate

我试图找到在我的应用上为LocalDate实现utils方法的最佳方法。

我需要为LocalDate添加方法逻辑。功能用途是定义localDate是否为结束日期,并从LocalDate计算结束日期。

截止日期通常是一个月的两个首个工作日。 因此,从这个功能要求,我想用3种方法在我的代码上添加这个逻辑:

boolean isClosingDate(LocalDate date){
...
}

如果日期是截止日期,则返回true。

LocalDate getEndClosingDate(LocalDate date){
...
}

从一天返回最后一个结束日。

LocalDate getNextDayAfterClosing(LocalDate date){
...
}

返回一个月的第一个非结束日。

我不需要方法内容,因为我完全知道算法应该是什么。

那么,我需要你的帮助才能找到如何在我的Spring应用程序上实现这种逻辑的最佳方法?我必须在ClosingDateService上放置方法吗?

我想用一个" ClosingDate"扩展LocalDate。 class,但是来自第一个布尔方法" isClosingDate"它之间存在冲突,因为这意味着我的对象不一定是ClosingDate。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这听起来就像是对我的商业服务。

非常粗略,基本上有两种选择:

  • 将这些方法放在某个(有状态的)模型类中。
  • 将它们放入某些(无状态)服务/组件/实用程序类中。

让我们看看它如何与有状态的模型类一起工作。您无法延长LocalDate,因此您最终可能会使用方法new ClosingDateCalculator(myLocalDate)isClosingDate()getEndClosingDate()getNextDayAfterClosing()。您不再需要将myLocalDate作为参数传递给这些方法,否则将其传递给构造函数,因此所有 statefullness 都没有任何意义。

使用该服务,您可能会ClosingDateService使用方法isClosingDate(date)getEndClosingDate(date)getNextDayAfterClosing(date),就像您在问题中指定的一样。由于ClosingDateService不需要使用任何状态进行初始化,因此Spring可以对其进行管理(初始化,注入等)。

所以它基本归结为

new ClosingDateCalculator(myLocalDate).isClosingDate()

 @Autowired
 private ClosingDateService closingDateService;
 // ...
 closingDateService.isClosingDate(myLocalDate);

我肯定更喜欢第二种选择。在第一种替代方案中,我没有看到太多的价值,因此它将花费我整个DI机器。

答案 1 :(得分:2)

我应该将此作为评论,但它不适合,因此请将其视为评论。

哦,我的!我们目前在申请中也接近同样的事情;没有,就像方法名称不同,但逻辑是99%那里。最初这是一个static factory class,其中包含静态工厂方法,正如您所期望的那样。

后来,我重新考虑并将其移至Service;原因很简单。首先,它已经变得太大而且很难维护。这是一个小论点 - 但问题是它包含来自不同逻辑位置的实用方法。让我解释一下:我希望能够非常轻松地添加HolidayClosingDatesServiceAnniversaryContractService等。这些names非常清楚这些服务将要做什么,他们也做了我们的应用程序的逻辑单一(与DateUtils.isAnyversarryDateForUser等相反......)。例如,一旦你需要将一些用户绑定到一个日期(这似乎你最终会),这是特别棘手。有了Spring,这是一件轻而易举的事。

第二个是testing。我可以根据需要隔离测试并测试我想要的任何内容。将这些作为spring services/beans使这个很容易做到。