为什么我只能有一个Calendar对象实例

时间:2011-05-19 07:18:07

标签: java calendar

我只是想知道......

为什么我只能有一个Calendar对象实例。是否有理由成为单身人士?

我试图阅读documentation,但他们没有提到为什么需要这样做。快速谷歌搜索没有给我任何答案。

4 个答案:

答案 0 :(得分:30)

日历不是单身,它是一个抽象类。 getInstance方法是Factory方法,它返回Calendar类的具体实现。

在Google上搜索java.util.Calendar源代码,您将看到它是如何工作的。

答案 1 :(得分:9)

不是单身人士。

此:

public static void main(String args[]) {
        Calendar c1, c2;
        c1 = Calendar.getInstance();
        c2 = Calendar.getInstance();
        c1.add(Calendar.MONTH, 1);
        System.out.println(c1);
        System.out.println(c2);
    }

输出:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Jerusalem",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Asia/Jerusalem,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=26,startDayOfWeek=6,startTime=7200000,startTimeMode=0,endMode=1,endMonth=8,endDay=13,endDayOfWeek=0,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=5,WEEK_OF_YEAR=21,WEEK_OF_MONTH=3,DAY_OF_MONTH=19,DAY_OF_YEAR=139,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=21,SECOND=27,MILLISECOND=839,ZONE_OFFSET=7200000,DST_OFFSET=3600000]
java.util.GregorianCalendar[time=1305789687839,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Jerusalem",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Asia/Jerusalem,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=26,startDayOfWeek=6,startTime=7200000,startTimeMode=0,endMode=1,endMonth=8,endDay=13,endDayOfWeek=0,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=4,WEEK_OF_YEAR=21,WEEK_OF_MONTH=3,DAY_OF_MONTH=19,DAY_OF_YEAR=139,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=21,SECOND=27,MILLISECOND=839,ZONE_OFFSET=7200000,DST_OFFSET=3600000]

(如你所见,这是不同的)

BTW,快速搜索source code returns

public static synchronized Calendar getInstance() {
       return new GregorianCalendar();
}

答案 2 :(得分:7)

您是否认为它是单身,因为它有getInstance() method?事实并非如此!

getInstance()每次都会返回一个新实例。

答案 3 :(得分:2)

您可以根据需要拥有尽可能多的Calendar实例...模数它是一个抽象类,因此您正在讨论日历的子类的实例。 / p>

也许你认为getInstance()方法返回一个单例对象?它没有。每次调用它时,它都会创建并返回一个新对象。

(javadoc没有明确说明日历不是单例,但它说“返回的日历基于当前时间......”。这意味着它正在返回每次都有一个新对象...因为当前时间不断变化。无论如何,如果您需要查看源代码,那就是该方法的作用。)