在java.time.Periodclass中,withDays()、withMonths()、withYears()的作用是什么

In java.time.Period class, what are the purposes of withDays(), withMonths(), withYears()

我注意到 java.time.Period class 包含一些实例方法,它们的行为与可用的静态工厂方法相同。

这些实例方法令人困惑,因为它们创建了一个新的 Period 并 return 它们,但没有考虑调用它们的 Period 的状态。

Period p = Period.ofWeeks(3);
p = p.withDays(2);

这似乎合乎逻辑 return 3 周零 2 天,但 return 只有 2 天。这与我调用 Period.ofDays(2) 一样。

此外,还有其他五个没有类似实例方法的静态工厂方法。

那么,这三个实例方法存在的原因是什么?如果是这样,用例是什么?

你做出了一个不幸的测试选择,基本上 - "weeks" 不是一个独立的单位;这只是 7 天的 shorthand。来自 ofWeeks 的文档:

The resulting period will be day-based, with the amount of days equal to the number of weeks multiplied by 7. The years and months units will be zero.

当您随后调用 withDays 时,这实际上是 "overwriting" 结果中的天数,从 21 天变为 2 天。

所以试试这个:

Period p = Period.ofMonths(3);
p = p.withDays(2);

现在 3 个月零 2 天。

在java-8 new Date API中,这可能是一个规则,以of开头的方法表示创建或新建一个Object,通常是静态方法,并且该方法start with with 表示修改一些属性,通常是一个对象方法。

所以Period.ofDays(2)表示创建一个Period属性days为2,但是withDays(2)表示修改一个Period属性days为新值2.

他们有不同的作用。