我试图找到在我的应用上为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。
提前感谢您的帮助!
答案 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
;原因很简单。首先,它已经变得太大而且很难维护。这是一个小论点 - 但问题是它包含来自不同逻辑位置的实用方法。让我解释一下:我希望能够非常轻松地添加HolidayClosingDatesService
或AnniversaryContractService
等。这些names
非常清楚这些服务将要做什么,他们也做了我们的应用程序的逻辑单一(与DateUtils.isAnyversarryDateForUser
等相反......)。例如,一旦你需要将一些用户绑定到一个日期(这似乎你最终会),这是特别棘手。有了Spring,这是一件轻而易举的事。
第二个是testing
。我可以根据需要隔离测试并测试我想要的任何内容。将这些作为spring services/beans
使这个很容易做到。