Почему новая дата (int year, int month, int day) устарела?

Мое приложение, которое я недавно унаследовал, ПОЛНО предупреждений об устаревании конструктора:

Date d = new Date(int year, int month, int day)

Кто-нибудь знает или может указать причину, по которой нечто столь же простое, как это, было «заменено» чем-то вроде этого:

Date d = null;
Calendar cal = GregorianCalendar.getInstance();
cal.set(1900 + year, month, day);
d = cal.getTime();

Очевидно, что предупреждения об устаревании не являются проблемой сами по себе, но можете ли вы представить себе миллионы LOC, которые кричали бы в агонии, если бы этот конструктор когда-либо был удален?

В моем небольшом эксперименте по тестированию производительности последнего требуется примерно на 50% больше времени для выполнения.


person Scott Bennett-McLeish    schedule 20.01.2009    source источник
comment
Разве первая строка не пустая трата времени? Вы получаете Date от вызова к Calendar.getTime (), так зачем создавать его с новым вызовом Date (), который затем отбрасывается? Особенно, если вы тестировали это ...   -  person unwind    schedule 20.01.2009
comment
@ расслабиться: хороший улов. почему бы и нет, сделайте пост.   -  person Adeel Ansari    schedule 20.01.2009
comment
Возможно, это потому, что американцы ждали Date (int year, int day, int month) ;-)   -  person Skizz    schedule 20.01.2009
comment
@unwind: конечно, в этом случае это может не иметь смысла, но вам не всегда нужна дата текущего времени, подумайте о днях рождения, сроке годности и т. д.   -  person Scott Bennett-McLeish    schedule 21.01.2009
comment
@Scott: Даже тогда вы можете установить его через cal.set (..), как вы это делаете. Я считаю, что когда вы собираетесь использовать календарь, вам не следует создавать экземпляр своей даты, как то, что вы сделали.   -  person Adeel Ansari    schedule 21.01.2009
comment
@Adeel Я понимаю вашу точку зрения, но когда существующая система ожидает java.util.Date, вы даете java.util.Date. Возможно, со временем, с более глубоким пониманием системы, можно будет сделать больше для рефакторинга старых API.   -  person Scott Bennett-McLeish    schedule 21.01.2009
comment
Что означает «LOC»?   -  person Nicolas Barbulesco    schedule 13.09.2013
comment
@NicolasBarbulesco LOC == Строки кода   -  person Scott Bennett-McLeish    schedule 14.09.2013
comment


Ответы (6)


Первоначально Date должен был содержать всю логику, касающуюся дат, но разработчики API в конечном итоге поняли, что API, который у них был до сих пор, был ужасно неадекватным и не мог быть полностью расширен для правильного решения таких проблем, как часовые пояса, локали, разные календари, переход на летнее время. раз и т. д.

Поэтому они создали Calendar, чтобы справиться со всей этой сложностью, а Date упростили простой меткой времени, отказавшись от всех ее функций, связанных с форматированием, синтаксическим анализом и отдельными полями даты.

Кстати, внутри эти методы, такие как Date(int, int, int) constructor, теперь вызывают Calendar, поэтому, если вы видите разницу в скорости, значит, вы делаете что-то не так при вызове Calendar.

Итог: чересчур сложен не Calendar API Java, это человеческое понятие дат, и единственная проблема с Calendar заключается в том, что он предлагает не так уж много способов быстрого доступа к наиболее распространенным применениям.

person Michael Borgwardt    schedule 20.01.2009
comment
java.util.Date повторно использует статический экземпляр григорианского календаря. Что, мягко говоря, интересно. Но будет работать лучше, чем создание нового календаря для каждого цикла. - person Martin; 09.09.2014

API-интерфейсы Java Date уже давно подвергаются критике, см., Например, эта ветка.

Вы можете попробовать Joda-Time или Apache Commons Lang для альтернативных утилит даты / времени.

person Einar    schedule 20.01.2009
comment
Я вспоминаю, как некоторое время назад смотрел презентацию Joda на Parleys и был впечатлен. parleys.com/display/PARLEYS/. Что касается ретро-реализации в 100 из 1000 или LOC, я не уверен. - person Scott Bennett-McLeish; 21.01.2009
comment
Хорошая точка зрения. Позднее Joda-Time использовался в качестве основы для разработки java.time, современной даты Java и time API. Встроен из Java 8, а также обратно перенесен на Java 6 и 7. Это то, что я рекомендую всем использовать сейчас. - person Ole V.V.; 04.09.2019

Ответ - портативность.

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

Тем не менее, это не очень удобно.

person guerda    schedule 20.01.2009

В основном потому, что исходный java.util.Date был раздутым, не полностью учитывал часовой пояс и не подходил для интернационализации.

Однако Date все еще используется и очень хорошо используется в объектах-значениях или, скажем, как тип данных. Если вы явно сделаете его неизменяемым, вы можете пойти с ним легко. Я склонен думать, что он должен быть неизменным, иначе у нас есть Календарь, которым можно манипулировать. Там, где ожидается множество манипуляций, следует рассмотреть что-то вроде Joda-Time.

[Отредактировано]

Только не создавайте экземпляр Date в последнем коде. Это бесполезно. Вы можете добиться лучшего результата для своего теста.

person Adeel Ansari    schedule 20.01.2009

Конечно, никто никогда не использует какой-либо другой формат календаря, но новый API увеличивает объем кода, который нужно писать для 99% распространенных случаев, так что это большое благо для программистов Java, оплачиваемых LoC.

person bobince    schedule 20.01.2009
comment
HA, неужели в наши дни LoC не используется в качестве показателя производительности? - person Scott Bennett-McLeish; 21.01.2009
comment
Можно было бы надеяться, что нет, но, возможно, парни из Sun, которые продолжают выпускать подобные API, не слышали, что что-то изменилось ... - person bobince; 21.01.2009

С технической точки зрения, у Майкла Боргвардта был лучший ответ. Но почему он обвиняет людей в том, как устроена наша солнечная система?

Хорошо, мы пришли к идее секунд, минут и часов.

Но мы не виноваты в том, что земной день является приблизительным (в зависимости от того, говорим ли мы об истинном солнечном дне, среднем солнечном дне или звездном дне, каждый из которых периодически и случайным образом изменяется). Мы не виноваты в том, что время обращения Земли по орбите вокруг Солнца составляет приблизительно 365 дней, и не наша вина в том, что орбита Луны вокруг Земли составляет приблизительно 27,3 дня. (в зависимости от того, говорим ли мы о сидерическом, синодическом, тропическом, аномальном или драконовом (узловом) месяце).

Разве вам не приятно, что Календарь не учел все эти детали? Тогда наши программные ошибки действительно могут зависеть от фазы луны.

person Tihamer Toth-Fejel    schedule 22.03.2011
comment
Капитан Очевидность снова наносит удар! Копировать не нужно, просто укажите. en.wikipedia.org/wiki/Gregorian_calendar - person IceGlow; 20.11.2012