Почему у меня может быть только один экземпляр объекта Calendar - PullRequest
22 голосов
/ 19 мая 2011

Мне было просто интересно ...

почему я могу иметь только один экземпляр объекта Calendar. Есть ли причина для этого быть синглтоном?

Я пытался прочитать документацию , но они не упомянули, зачем это нужно. И быстрый поиск в Google не дал мне ответов.

Ответы [ 4 ]

31 голосов
/ 19 мая 2011

Календарь - это не синглтон, это абстрактный класс.getInstance - это метод Factory, который возвращает конкретную реализацию класса Calendar.

Найдите в Google исходный код java.util.Calendar, и вы увидите, как он работает.

9 голосов
/ 19 мая 2011

Это не синглтон.

Это:

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]

(что, как вы можете видеть, отличается)

Кстати, быстрый поиск по исходному коду возвращает :

public static synchronized Calendar getInstance() {
       return new GregorianCalendar();
}
7 голосов
/ 19 мая 2011

Вы думали, что это синглтон, потому что у него есть getInstance() метод ? Это не тот случай!

getInstance() каждый раз возвращает новый экземпляр.

2 голосов
/ 19 мая 2011

Вы можете иметь столько экземпляров Calendar, сколько захотите ... по модулю, что это абстрактный класс, так что вы говорите об экземплярах дочерних классов Календаря.

Возможно, вы думаете, что метод getInstance() возвращает одноэлементный объект? Это не так. Он создает и возвращает новый объект каждый раз, когда вы вызываете его.

(Javadoc явно не заявляет, что календарь не является единичным, но он говорит «Возвращенный календарь основан на текущем времени ...» . Это означает, что он возвращает каждый раз новый объект ... потому что текущее время постоянно меняется. И в любом случае, это то, что делает метод, если вы захотите посмотреть на исходный код.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...