为什么 java.time.Period 没有构造函数?
Why does java.time.Period have no constructor?
相反,必须使用 Period.of(int, int, int),或其他同样的静态方法。
这背后的原因是什么?
Period 是最终的 class 所以不能延长,所以每个人都可以认为 Period 是不可变的。私有构造函数是确保正确创建 Period 的另一种方法。
主要原因 - 它是 util class 并且大多数 util classes 应该以静态方式使用(至少 java 架构师希望如此)。您可以将其与使用 java.lang.Math.
进行比较
第二个原因,我建议——反射和序列化。我认为处理 Period.class 更方便,但这只是建议。在实现内部,他们有静态方法 create() 并且总是使用 create() 而不是构造函数。
你也可以看看源码。例如,这里:http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/e63cf6b55a95/src/java.base/share/classes/java/time/Period.java
public static final Period ZERO = new Period(0, 0, 0);
public static Period of(int years, int months, int days) {
return create(years, months, days);
}
private static Period create(int years, int months, int days) {
if ((years | months | days) == 0) {
return ZERO;
}
return new Period(years, months, days);
}
private Period(int years, int months, int days) {
this.years = years;
this.months = months;
this.days = days;
}
相反,必须使用 Period.of(int, int, int),或其他同样的静态方法。
这背后的原因是什么?
Period 是最终的 class 所以不能延长,所以每个人都可以认为 Period 是不可变的。私有构造函数是确保正确创建 Period 的另一种方法。
主要原因 - 它是 util class 并且大多数 util classes 应该以静态方式使用(至少 java 架构师希望如此)。您可以将其与使用 java.lang.Math.
进行比较第二个原因,我建议——反射和序列化。我认为处理 Period.class 更方便,但这只是建议。在实现内部,他们有静态方法 create() 并且总是使用 create() 而不是构造函数。
你也可以看看源码。例如,这里:http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/e63cf6b55a95/src/java.base/share/classes/java/time/Period.java
public static final Period ZERO = new Period(0, 0, 0);
public static Period of(int years, int months, int days) {
return create(years, months, days);
}
private static Period create(int years, int months, int days) {
if ((years | months | days) == 0) {
return ZERO;
}
return new Period(years, months, days);
}
private Period(int years, int months, int days) {
this.years = years;
this.months = months;
this.days = days;
}