我注意到与日期相关的类型 - LocalDate , LocalDateTime , OffsetDateTime , ZonedDateTime - - 只有 LocalDate 接受时代作为构造参数:
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 参数。据我所知,影响其他类型 Era 的唯一方法是使用构建过程中使用的日历。
有人能够解释这个设计选择吗?
答案 0 :(得分:3)
基本上是疏忽和避免大量超载的混合物。在LocalDateTime
中使用这样的构造函数肯定会产生逻辑 sense 。
ZonedDateTime
和OffsetDateTime
没有构造函数接受单独的组件 - 您需要从其他类型之一创建它们。所以只需要添加任何内容LocalDateTime
。
但是,有一个问题是要添加哪些重载。 LocalDateTime
中已经有8个构造函数 - 四个精度变量(低至分钟,秒,毫秒,以及毫秒内的刻度)和每个接受CalendarSystem
或假设ISO的两个重载。我不想将这个构造函数的数量加倍到16(并且已经奇怪的是,在2.0中你不能用构造函数直接构造一个纳秒精度的值......)
使用时代是非常不寻常的,因此,不是每个人都要付出很多构造函数来处理的复杂性成本,而是单独构建LocalDate
和LocalTime
更简单: / p>
var ldt = new LocalDate(Era.Xyz, yearOfEra, month, day, calendar) +
new LocalTime(....);
这很简单而且效率很高,没有过载爆炸的麻烦。