在 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);
句点允许链接方法查看实例方法plus
、plusDays
等
Period.ofYears(1).plus(Period.ofWeeks(1));
如果我这样编码:
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);
句点允许链接方法查看实例方法plus
、plusDays
等
Period.ofYears(1).plus(Period.ofWeeks(1));