2016-09-06 3 views
1

я заметил, что из дат, связанных с типами - LocalDate, LocalDateTime, OffsetDateTime, ZonedDateTime - только LocalDate принимает эру в качестве параметра строительства:Эра в NodaTime

public LocalDate(int year, int month, int day); 
public LocalDate(Era era, int yearOfEra, int month, int day, [NotNullAttribute] CalendarSystem calendar); 

Являются ли конструкторы, основанные только на эпохе, предоставленными только в качестве удобства? И если да, то почему он не распространяется на другие типы, которые ограничивают конструкторы значениями, не относящимися к эпохе? Например:

public LocalDateTime(int year, int month, int day, int hour, int minute); 

Все типы имеют неизменный параметр Era. Насколько я могу судить, единственный способ повлиять на Эра в других типах - это календарь, используемый во время строительства.

Может кто-нибудь объяснить этот выбор дизайна?

ответ

3

Смесь надзора и предотвращения массивной перегрузки, в основном. Разумеется, логический имеет смысл, чтобы иметь такой конструктор в LocalDateTime.

ZonedDateTime и OffsetDateTime не имеют конструкторов, принимающих отдельные компоненты для начала - вы должны создать их из одного из других типов. Так что это действительно действительно LocalDateTime, которому нужно что-нибудь добавить.

Однако есть вопрос, какие перегрузки добавить. Уже есть 8 конструкторов в LocalDateTime - четыре варианта точности (до минуты, секунды, миллисекунды и галочки в миллисекундах) и две перегрузки для каждого из них, чтобы принять CalendarSystem или принять ISO. Я не хочу удваивать это число конструкторов до 16 (и это уже странно, что в 2.0 вы не можете напрямую построить значение до наносекундной точности с помощью конструктора ...)

Использование эры довольно необычно, так, а не все, чтобы платить цену сложности иметь много конструкторов, чтобы иметь дело с, это проще всего построить LocalDate и LocalTime отдельно:

var ldt = new LocalDate(Era.Xyz, yearOfEra, month, day, calendar) + 
      new LocalTime(....); 

это просто и по-прежнему эффективно, без головной боли перегрузки раздутия ,

+0

Ответ дает ясность и имеет смысл. И только для того, чтобы убедиться, что я полностью настроен: Можно ли предположить, что эпоха могла быть исключена из строительства вообще без потери функциональности, которую можно было бы повторно захватить с помощью дополнительных методов? Например, свойство 'LocalDate.YearOfEra' будет заменено на' LocalDate.YearOfEra (Era) '. – Tomcat

+0

@Tomcat: Нет, важно иметь возможность легко создавать даты в заданную эпоху, хотя это относительно нишевой вариант использования. Метод 'LocalDate.YearOfEra (Era)' не смог бы построить «LocalDate», и это не имело бы большого смысла, поскольку вам нужно было знать первую эру ... не похоже, что вы можете представить дата в 123BC и спросить, какой его год в эпоху AD ... –