java 8中的Periods类实现

Has*_*hra -2 java class period method-chaining java-time

如果我这样编码:

Period wrong = Period.ofYears(1).ofWeeks(1);
Run Code Online (Sandbox Code Playgroud)

它给出了输出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);
Run Code Online (Sandbox Code Playgroud)

All minus___()plus___()方法是LocalDateTime类中的实例方法.

问题:为什么课程不允许进行方法链接Period

为什么Period班级不支持?

内部任务如何进行?

Gho*_*ica 12

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

Period wrong = Period.ofYears(1).ofWeeks(1);
Run Code Online (Sandbox Code Playgroud)

是相同的:

Period wrong = Period.ofWeeks(1);
Run Code Online (Sandbox Code Playgroud)

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

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

ofXyz()调用创建一个新的时期对象为您服务.该对象已完成并创建.将现有时期的另一个电话链接起来的精神病应该是什么ofXyz()

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

  • @HasnainAliBohra为什么会这样:因为这就是这些方法的设计方式. (3认同)

Nah*_*eul 9

期间允许链的方法,看一下实例方法plus,plusDays等等.

Period.ofYears(1).plus(Period.ofWeeks(1));
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 6

通过Period类的实现,我们知道所有的_____()方法都是静态的.

究竟.

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

相反,您正在ofWeeks此实例上调用静态方法.这样做会给你一个编译器警告,正是你所演示的原因 - 它看起来很有误导性.

这个问题谈到了这个行为:为什么不通过实例调用静态方法为Java编译器的错误?在我看来,完全可以做到这一点的Java设计选择很差.

如果要使用DateTime类进行相同的链接...所有减号___()和加___()方法都是LocalDateTime类中的实例方法

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

// 1 year and 5 weeks
Period.ofYears(1).plusDays(5 * 7);
Run Code Online (Sandbox Code Playgroud)

  • @Tom我认为保持大小顺序递减是有价值的.将它读作"一周一年"感觉有点不自然.但仍然是一个很好的选择. (2认同)