Вопрос с собеседования · Java

Почему java.time (Java 8) предпочитают старым Date/Calendar?

JuniorДата и время
Коротко

java.time (Java 8) неизменяем, потокобезопасен и с явной моделью: Instant, LocalDate, LocalTime, ZonedDateTime, Duration, Period. Date и Calendar изменяемы, месяцы с нуля, SimpleDateFormat не потокобезопасен, Date смешивает момент и представление.

  • Новый код — только java.time
  • Старые API — конвертировать на границе: date.toInstant(), Date.from(instant)
  • JDBC 4.2, JPA 2.2, Jackson поддерживают java.time

А ещё Основан на Joda-Time (JSR-310)

Подробно

Старые Date/Calendar изменяемы и не потокобезопасны: у Calendar месяцы с нуля, SimpleDateFormat нельзя шарить между потоками, большая часть Date устарела. java.time (JSR-310) разделяет момент, дату, время и зону, все типы неизменяемы и потокобезопасны, API текучий и предсказуемый — это стандарт для нового кода.

Что хотят услышать

  • Проблемы старого API.
  • Преимущества java.time.

Частые ошибки

  • Использовать SimpleDateFormat как общий static (он не потокобезопасен).
  • Забывать, что в Calendar январь = 0.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓java.time неизменяем и потокобезопасен; Date/Calendar изменяемы и полны ловушек
  • ✗java.time — это обёртка над Calendar с теми же проблемами, но с удобными именами методов
  • ✗java.time быстрее, но так же изменяем, как Date
  • ✗Date удалён из JDK, альтернатив нет

Что спросят дальше

  • Какие основные типы есть в java.time?
  • Как навести мост со старым Date?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования