Подтвердить что ты не робот

Почему API дат Java (java.util.Date,.Calendar) такой беспорядок?

Как известно большинству людей, API Java для обработки дат календаря (в частности, классов java.util.Date и java.util.Calendar) - ужасный беспорядок.

Сверху моей головы:

  • Дата изменена.
  • Дата представляет собой метку времени, а не дату
  • нет простого способа конвертировать между компонентами даты (день, месяц, год...) и дата
  • Календарь неудобен для использования и пытается объединить различные системы календаря в один класс

Этот пост подводит итог, и JSR-310 также исчерпывает эти проблемы.

Теперь мой вопрос:

Как эти классы вошли в Java SDK? Большинство из этих проблем кажутся довольно очевидными (особенно Дата изменчива), и их было бы легко избежать. Итак, как это произошло? Время поджимает? Или проблемы очевидны только в ретроспективе?

Я понимаю, что это не вопрос программирования, но мне было бы интересно понять, как дизайн API может ошибиться. В конце концов, ошибки всегда являются хорошей возможностью для изучения (и мне любопытно).

4b9b3361

Ответ 1

Кто-то положил это лучше, чем я мог когда-либо сказать:

  • Класс Date представляет собой конкретный момент времени, с миллисекундой точность. Дизайн этого класса - очень плохая шутка - отрезвляющая пример того, как даже хорошие программисты завинчиваются. Большинство методов в Дата теперь устарела, заменена методами в нижеприведенных классах.
  • Класс Calendar является абстрактным классом для преобразования между a Dateобъект и набор целочисленных полей, таких как год, месяц, день и час.

  • Класс GregorianCalendar является единственным подклассом Calendar в JDK. Преобразования Date-to-fields для календарной системы в общего пользования. Sun лицензировала этот переработанный мусор от Taligent - a отрезвляющий пример того, как усложняются средние программисты.

из часто задаваемых вопросов программистов Java, версия от 07.X.1998, Peter van der Linden - эта часть была удалена из более поздних версий.

Что касается изменчивости, многие из ранних классов JDK страдают от него (Point, Rectangle, Dimension,...). Неверные оптимизации, я слышал, как некоторые говорят.

Идея состоит в том, что вы хотите иметь возможность повторно использовать объекты (o.getPosition().x += 5), а не создавать копии (o.setPosition(o.getPosition().add(5, 0))), как вы должны делать с неизменяемыми. Возможно, это была хорошая идея с ранними виртуальными машинами, хотя, скорее всего, это не современные виртуальные машины.

Ответ 2

Java ранние API - это не что иное, как продукт своего времени. Неизменность стала популярной концепцией спустя годы. Вы говорите, что неизменность "очевидна". Это может быть правдой сейчас, но это было не так. Точно так же, как инъекция зависимости теперь "очевидна", но это было не 10 лет назад.

В то время было слишком дорого создавать объекты Calendar.

Они остаются таковыми для соображений обратной совместимости. Скорее всего, более неудачным было то, что после того, как была допущена ошибка, старый класс не устарел, а новые классы даты и времени были созданы для всех API-интерфейсов. Это в некоторой степени произошло с внедрением JDK 8 API JodaTime, как API (java.time, JSR 310), но на самом деле это слишком поздно.

Ответ 3

Время само по себе нелегко измерить и обработать. Просто просмотрите длину статьи wikipedia о time. И тогда есть разные понимания самого времени: точка времени абсента (как константа), точка времени в определенном месте, временной интервал, разрешение времени....

Помню, когда я впервые увидел java.util.Date(JDK 1.0?), я был очень рад этому. Языки, о которых я знал, не имели такой возможности. Я не думал о преобразовании времени и т.д.

Я думаю, что это беспорядок, потому что все, что меняется, оставляет беспорядок, если вы эволюционируете с одного уровня понимания (XMLGregorianCaldender vs. Date) и требований (наносекунды, в 2030 году) до более высокого уровня, но сохраняя старый нетронутый. И java.util.Date не является исключением. Просто посмотрите на подсистему ввода/вывода или переход от AWT к Swing...

И из-за этого "мы должны иногда нажимать кнопку reset". (кто сказал это, кстати??)