我有这样的代码
Instant now = Instant.now();
if (amountDays >= 0) {
now = now.plus(amountDays, ChronoUnit.DAYS);
} else {
now = now.minus(Math.abs(amountDays), ChronoUnit.DAYS);
}
我想把它简化成这样
Instant now = Instant.now();
now = now.plus(amountDays, ChronoUnit.DAYS);
然而,我不确定plus
是否正确地工作与负值,或者如果这搞砸了结果。
我可以像那样使用plus
,可能是负值吗?
plus
为负值
plus
方法支持添加负时间以返回时间,从它的文档:
amountToAdd -要添加到结果中的单位的数量,可以是负的
都很好,你可以这样使用它,它会像预期的那样工作。
实现小细节,minus
的当前实现甚至将-amountToSubtract
作为值委托给plus
:
return (amountToSubtract == Long.MIN_VALUE
? plus(Long.MAX_VALUE, unit).plus(1, unit)
: plus(-amountToSubtract, unit));
指出一般来说,如果你只是想回到过去,为了可读性,更喜欢使用minus
。
在您的特殊情况下,我会坚持只使用plus
,但不要不必要地膨胀代码和逻辑。相反,更喜欢添加注释
// amountDays may be negative
或者确保你的javadoc是清楚的。
微小的改进,您可以将代码从两个语句简化为一个语句:
Instant now = Instant.now().plus(amountDays, ChronoUnit.DAYS);
看看minus
是如何实现的
@Override
public Instant minus(long amountToSubtract, TemporalUnit unit) {
return (amountToSubtract == Long.MIN_VALUE ? plus(Long.MAX_VALUE, unit).plus(1, unit) : plus(-amountToSubtract, unit));
}
当然,为了可读性起见,在适当的情况下使用plus
和minus
是有意义的,但检查amountDays
是否比0
更大或更低似乎是某种内部Instant.plus
逻辑,并且绝对是对代码的可读性没有帮助