为何java.time.chrono的HijrahDate中plusMonths等方法非公开?
HijrahDate作为伊斯兰历法的实现类,属于java.time.chrono包,它存在包私有(未公开)且未被包内使用的plusMonths()、plusWeeks()等方法,主要有以下几个可能的原因:
API设计的预留与兼容性考量:
Java时间API采用接口驱动设计,ChronoLocalDate接口定义了这些时间增减方法。HijrahDate实现该接口时,最初或许计划公开这些方法,但后续因伊斯兰历法的特殊性——比如月份天数无固定规则、依赖新月观测,开发团队认为直接公开可能引发歧义或不符合用户预期,因此暂时将其设为包私有。保留这些方法而非删除,是为了后续若调整API策略(比如完善历法计算逻辑后),无需修改类结构即可公开,避免破坏向后兼容性。代码结构的统一性:
为了和同包下的其他历法实现类(如ThaiBuddhistDate、MinguoDate)保持一致的代码结构,HijrahDate遵循了相同的方法实现模板。即使暂时不对外暴露,也维持了与其他历法类一致的方法签名,减少代码维护的复杂度。开发与测试阶段的遗留:
这些方法可能是开发过程中用于内部测试、验证历法计算逻辑的临时实现。测试完成后,因暂不具备公开条件(比如计算逻辑未完全稳定),便保留为包私有状态,而非直接删除,方便后续迭代时复用或调试。历法特性的特殊限制:
伊斯兰历法是纯阴历,月份的起始依赖实际的新月观测,而非固定的日期规则。plusMonths()这类方法的语义在伊斯兰历法中存在模糊性——比如"加1个月"是按固定30天计算,还是按实际新月周期?直接公开这类方法可能会让用户误解其行为,因此开发团队选择暂时隐藏,转而引导用户使用更通用的plus(long amountToAdd, TemporalUnit unit)或plus(TemporalAmount amount)方法,以便更明确地控制计算逻辑。
内容的提问来源于stack exchange,提问作者Amer

