在 java 8 期间 class 实施

Periods class implementation in java 8

如果我这样编码:

Period wrong = Period.ofYears(1).ofWeeks(1);

它给出 P7D.

的输出

通过 Period class 的实现我们知道所有 of____() 方法都是静态的。

但是如果你用 DateTime 做同样的链接 class:

LocalDate date = LocalDate.of(2020, Month.JANUARY, 20);
LocalTime time = LocalTime.of(5, 15);
LocalDateTime dateTime = LocalDateTime.of(date, time)
  .minusDays(1).minusHours(10).minusSeconds(30);

所有 minus___()plus___() 方法都是 LocalDateTime class 中的实例方法。

问题:为什么 方法链接 不允许用于 Period class?

为什么 Period class 不支持它?

内部作业进行的怎么样了?

您在第一个示例中不是链接调用。

Period wrong = Period.ofYears(1).ofWeeks(1);

等同于:

Period wrong = Period.ofWeeks(1);

换句话说:ofYears() 返回的对象不会影响 ofWeeks() 的结果,它的年份值将被丢弃。您正在调用 static 方法 ofWeeks()。你在那里做的是 而不是 流畅的调用链。

任何体面的 IDE 都应该警告您这样做。原因很简单:这个"chaining"根本就没有意义!

ofXyz() 调用为您创建一个新的 Period 对象。该对象已 完成 并已创建。 链接 另一个 ofXyz() 调用到现有期间的语义应该是什么?

换句话说:您不能链接 ofXyz() 调用,因为没有明确的方法来表达这样的链接应该具有的 语义

By the implementation of Period class we know that all of____ () methods are static.

完全正确。

所以 Period.ofYears(1) 会给你一个 Period 的实例 但是 你没有使用这个实例做任何有用的事情。

相反,您在此实例上调用了静态方法 ofWeeks。这样做会给你一个编译器警告,正是因为你已经证明的原因 - 它看起来具有误导性。

这个问题稍微谈到了这种行为:Why isn't calling a static method by way of an instance an error for the Java compiler? 在我看来,Java 能够做到这一点是一个糟糕的设计选择。

If you to do same chaining with DateTime Class ... all minus___() and plus___() methods are instance methods in LocalDateTime Class

这些方法在 Period 中仍然存在,除了 plusWeeks。相反,您可以这样做:

// 1 year and 5 weeks
Period.ofYears(1).plusDays(5 * 7);

句点允许链接方法查看实例方法plusplusDays

Period.ofYears(1).plus(Period.ofWeeks(1));