java 8中的句点类实现[关闭]

问题描述 投票:-2回答:3

如果我这样编码:

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班不支持?

内部任务如何进行?

java class java-time method-chaining period
3个回答
12
投票

你没有在第一个例子中链接电话。

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

是相同的:

Period wrong = Period.ofWeeks(1);

换句话说:ofYears()返回的对象不会影响ofWeeks()的结果,它的年份值将被丢弃。您正在调用静态方法ofWeeks()。你在做什么不是一个流畅的呼叫链。

任何体面的IDE都应该警告你这样做。原因很简单:这种“链接”根本没有意义!

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

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


9
投票

期间允许链式方法看看实例方法plusplusDays等。

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

6
投票

通过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);
© www.soinside.com 2019 - 2024. All rights reserved.