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

时间:2015-03-13 07:47:01

标签: java

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);
}

3 个答案:

答案 0 :(得分:5)

我认为答案很简单Calendar是一个抽象类,所以我们无法创建它的实例。现在,当您致电Calendar.getInstance时,会创建GregorianCalendar个实例。

答案 1 :(得分:2)

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

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

  • 构造函数总是返回调用构造函数的特定类的非null实例,或者它抛出异常并且您没有获得对部件构造的实例的引用;
  • 静态工厂方法可以返回子类或null(或者它会引发异常)。

后一种情况正是Calendar.getInstance()的作用:你显然没有找回Calendar本身的实例,因为它是抽象的,但你可能得到GregorianCalendarJapaneseImperialCalendar等。

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

答案 2 :(得分:-1)

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

而且,

Calendar.getInstance()是一种原生方法,记下本机方法没有正文/实现。他们已经从系统实现了。

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

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