【问题标题】:Why does java.time.Period have no constructor? [duplicate]为什么 java.time.Period 没有构造函数? [复制]
【发布时间】:2018-06-24 23:00:14
【问题描述】:

相反,必须使用 Period.of(int, int, int) 或其他类似的静态方法。

这背后的原因是什么?

【问题讨论】:

  • 你是在问为什么要使用静态创建者方法吗?

标签: java time api-design period


【解决方案1】:

主要原因 - 它是 util 类,并且大多数 util 类应该以静态方式使用(至少 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;
}

【讨论】:

    【解决方案2】:

    Period 是 final 类,所以不能扩展,所以每个人都可以认为 Period 是不可变的。私有构造器是确保正确创建 Period 的另一种方法。

    【讨论】:

    • java.lang.String - 也是最终的,但构造函数是公共的;)
    猜你喜欢
    • 2010-10-24
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2012-11-16
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多