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()调用,因为没有明确的方法来表达这样一个链应该具有的语义!
期间允许链的方法,看一下实例方法plus,plusDays等等.
Period.ofYears(1).plus(Period.ofWeeks(1));
Run Code Online (Sandbox Code Playgroud)
通过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)