В классе java.time.Period, каковы цели withDays(), withMonths(), withYears()
Я заметил, что класс java.time.Period содержит несколько методов экземпляра, которые ведут себя так же, как доступные статические методы factory.
-
.withDays()
ведет себя так же, как Period.ofDays()
-
.withMonths()
ведет себя так же, как Period.ofMonths()
-
.withYears()
ведет себя так же, как Period.ofYears()
Эти методы экземпляров сбивают с толку, поскольку они создают новый Период и возвращают их, но без учета состояния Периода, на который они вызывают.
Period p = Period.ofWeeks(3);
p = p.withDays(2);
Кажется логичным, что это вернет период в 3 недели, 2 дня, но он возвращает только период в 2 дня. Это то же самое, как если бы я звонил Period.ofDays(2)
.
Кроме того, существует пять других статических factory методов без аналогичных методов экземпляра.
Итак, есть ли причина, что эти три метода экземпляра будут существовать? Если да, то какой прецедент?
Ответы
Ответ 1
Вы сделали неудачный выбор для тестирования, в основном - "недели" не являются независимым подразделением; это всего лишь сокращение в течение 7 дней. Из документов для ofWeeks
:
Итоговый период будет основан на день, с количеством дней, равным количеству недель, умноженному на 7. Единицы лет и месяцев будут равны нулю.
Когда вы вызываете withDays
, это эффективно "перезаписывает" количество дней в результате, от 21 дня до 2 дней.
Поэтому попробуйте это вместо:
Period p = Period.ofMonths(3);
p = p.withDays(2);
Теперь это будет 3 месяца и 2 дня.
Ответ 2
В java-8 новом API-интерфейсе Date это правило может быть, метод начинается с of
означает создание или новый объект Object, обычно статический метод, а метод start с with
означает изменение некоторого атрибута, обычно метод объекта.
поэтому Period.ofDays(2)
означает создание периода, для которого атрибут дней равен 2, но withDays(2)
означает изменение дней атрибута Period для нового значения 2.
У них другая роль.