java 枚举内嵌枚举
几年前,我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”,其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit ,它比TimeUnit
更适合于并发以外的上下文(例如日期/时间操作)。
位于所述java.time.temporal包 ,所述ChronoUnit
类实现TemporalUnit接口 ,接口广泛使用的在高度期望 JDK 8导入日期/时间API 。 博客文章“ Java 8中的日期之间的天数 ”演示了使用此类来计算两个Temporal实例之间的时间段 。
博客文章“ Java 9.硬编码“永远”的地方。 ”介绍了JDK 9的“ TimeUnit类中的两个新方法” 。toChronoUnit()和of(ChronoUnit)这些方法支持将TimeUnit
转换为ChronoUnit
以及将ChronoUnit
为TimeUnit
。 并非ChronoUnit
所有值都可以转换为TimeUnit
的等效值,在这种情况下,将抛出IllegalArgumentException 。
关于ChronoUnit
中每个值的Javadoc注释描述了每个值代表什么时间单位。 但是,对ChronoUnit
每个值返回什么样的Duration ,这对我来说很有趣。 以下代码段会将这些Duration
的toString()
表示形式写入ChronoUnit
枚举中的所有值的标准输出。
显示计时单位的持续时间
for (final ChronoUnit unit : ChronoUnit.values())
{final Duration duration = unit.getDuration();out.println(unit + ": " + duration + " (" + duration.getSeconds() + " seconds)");
}
执行后,以上代码将产生以下输出:
Nanos: PT0.000000001S (0 seconds)
Micros: PT0.000001S (0 seconds)
Millis: PT0.001S (0 seconds)
Seconds: PT1S (1 seconds)
Minutes: PT1M (60 seconds)
Hours: PT1H (3600 seconds)
HalfDays: PT12H (43200 seconds)
Days: PT24H (86400 seconds)
Weeks: PT168H (604800 seconds)
Months: PT730H29M6S (2629746 seconds)
Years: PT8765H49M12S (31556952 seconds)
Decades: PT87658H12M (315569520 seconds)
Centuries: PT876582H (3155695200 seconds)
Millennia: PT8765820H (31556952000 seconds)
Eras: PT8765820000000H (31556952000000000 seconds)
Forever: PT2562047788015215H30M7.999999999S (9223372036854775807 seconds)
上面显示的每个Duration
字符串表示形式上的“ PT”前缀表示根据ISO-8601标准 ,该表示形式是“期间”持续时间标记(“ P”)和“时间”指示(“ T”)。 “ S”,“ M”和“ H”分别是秒,分钟和小时。 的值ChronoUnit
代表时间单位小于秒( NANOS , MICROS ,和MILLIS )示出了“0秒”,因为它们是小于1秒,返回值是一个整体long
。
关于ChronoUnit
类中定义的每个值的Javadoc注释编写得很好。 它们遵循我的想法,是Javadoc的“最佳实践”:在Javadoc中放置简洁但内容丰富的初始句子,以显示在生成HTML页面的“方法摘要”部分中,并在该初始摘要之后的句子中放置其他有用的详细信息句子。 例如, ChronoUnit.ERAS的Javadoc注释指出:“ 代表时代概念的单位。 ISO日历系统没有纪元,因此不可能在日期或日期时间中添加纪元。 人为地将时代的估计持续时间定义为1,000,000,000年。 与其他日历系统一起使用时,该装置没有任何限制。” “方法摘要”中显示的是加粗的句子(我加了强调),此处显示的全部文本完整显示在方法上方。
在ChronoUnit
枚举中,更有趣的值之一是FOREVER 。 如上面代码清单的输出所示, FOREVER
值的Duration
为“ PT2562047788015215H30M7.999999999S”,对应于2562047788015215小时,30分钟和7.999999999秒。 或者,正如Grzegorz Gajos所说的那样,“ Java 永远将其定义为9 223 372 036 854 775 807秒。 这是2.92277266×10 11年。 最好确保在超时之前安排在应用程序中进行Java升级。”
ChronoUnit.FOREVER
会有用? 其基于Javadoc的描述解释了其存在的主要原因:“代表永远概念的人工单位。 这主要与TemporalField
一起使用,以表示无限制的字段,例如年份或时代。 人为地将时代的估计持续时间定义为Duration
支持的最大持续Duration
。”
TimeUnit是使用Java的并发构造的有用枚举 ,并且可以在并发以外的其他上下文中使用,只要考虑了对这些其他上下文的一些严格限制即可。 JDK 8引入的ChronoUnit对于这些非并发上下文来说是一个更好的枚举,并且特别设计用于JDK 8 Date / Time API
翻译自: https://www.javacodegeeks.com/2018/01/highly-useful-java-chronounit-enum.html
java 枚举内嵌枚举