如果我这样编码:
Period wrong = Period.ofYears(1).ofWeeks(1);
它给出了P7D
的输出。
通过Period
类的实现,我们知道所有of____()
方法都是静态的。
但是如果你用DateTime
类做同样的链接:
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
类中的实例方法。
问题:为什么Period
课程不允许方法链接?
为什么Period
班不支持?
内部任务如何进行?
你没有在第一个例子中链接电话。
Period wrong = Period.ofYears(1).ofWeeks(1);
是相同的:
Period wrong = Period.ofWeeks(1);
换句话说:ofYears()
返回的对象不会影响ofWeeks()
的结果,它的年份值将被丢弃。您正在调用静态方法ofWeeks()
。你在做什么不是一个流畅的呼叫链。
任何体面的IDE都应该警告你这样做。原因很简单:这种“链接”根本没有意义!
ofXyz()
调用为您创建一个新的Period对象。该对象已完成并创建。什么应该是链接另一个ofXyz()
呼吁现有时期的semenatics?
换句话说:你不能链接ofXyz()
调用,因为没有明确的方法来表达这样一个链应该具有的语义!
期间允许链式方法看看实例方法plus
,plusDays
等。
Period.ofYears(1).plus(Period.ofWeeks(1));
通过Period类的实现,我们知道所有的_____()方法都是静态的。
究竟。
所以Period.ofYears(1)
会给你一个Period
的例子,但是你没有使用这个实例来做任何有用的事情。
相反,您在此实例上调用静态方法ofWeeks
。这样做会给你一个编译器警告,正是你所演示的原因 - 它看起来很有误导性。
这个问题谈了一下这个行为:Why isn't calling a static method by way of an instance an error for the Java compiler?在我看来,Java的设计选择很差,根本无法做到这一点。
如果要使用DateTime类进行相同的链接...所有减号___()和加___()方法都是LocalDateTime类中的实例方法
除Period
外,这些方法仍然存在于plusWeeks
中。相反,你可以这样做:
// 1 year and 5 weeks
Period.ofYears(1).plusDays(5 * 7);