繁体   English   中英

为什么Calendar类没有公共构造函数?

[英]Why does the Calendar class not have a public constructor?

new Calendar()有任何差别Calendar.getInstance()

这个问题就这么简单...........由于系统拒绝发布它,因此我在这里复制了一些废话。

private static Calendar calendar = Calendar.getInstance();
public static int getCalendar(long time, int calendarConst) {
    calendar.setTimeInMillis(time);
    return calendar.get(calendarConst);
}

我认为答案很简单Calendar是一个Abstract类,因此我们无法创建它的实例。 现在,当您调用Calendar.getInstance时,将创建GregorianCalendar实例。

在Effective Java第二版中详细说明了构造函数和静态工厂方法之间的区别,非常值得一读。

这里的主要区别在于两者的返回值:

  • 构造函数始终返回在其上调用构造函数的特定类的非null实例,否则它将引发异常,并且您不会获得对部分构造的实例的引用;
  • 静态工厂方法可以返回子类或null(或者引发异常)。

后一种情况正是Calendar.getInstance()所做的:由于它本身是抽象的,因此您显然不会返回Calendar本身的实例,但是相反,您可能会得到GregorianCalendarJapaneseImperialCalendar等。

这使Calendar的实现与客户端代码脱钩:您可以对Calendar进行更改,而无需客户端进行更改。

当您执行new Calendar() ,它将根据默认的Calendar实例创建新的日历实例。 有时通过构造函数创建实例不如从Factory方法创建实例。 这就是为什么它使用Factory方法创建实例的原因。

和,

Calendar.getInstance()是本机方法, 请注意本机方法没有正文/实现。 他们已经从系统中实现了。

它写在这里: https : //www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

并且,正如上面答案中已经解释的那样,日历实例是通过调用Calendar类创建的。 用于创建日历实例的静态Factory设计模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM