Подтвердить что ты не робот

В классе 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 методов без аналогичных методов экземпляра.

Итак, есть ли причина, что эти три метода экземпляра будут существовать? Если да, то какой прецедент?

4b9b3361

Ответ 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.

У них другая роль.