RFR:JDK-8141452:Convert between TimeUnit and ChronoUnit
Roger Riggs
Roger.Riggs at Oracle.com
Fri Jan 29 19:17:26 UTC 2016
Hi Martin,
Where did IllegalMonitorStateException creep in from?
Should I update the CCC I started or will you start fresh?
Otherwise, ok.
Roger
On 1/29/2016 2:12 PM, Martin Buchholz wrote:
> Here is a proposed alternative patch (against jsr166 CVS).
> Code is reworded and reformatted.
> Tests are junit-ified.
> Round-trip tests are added.
> toChronoUnit no longer throws IAE, because it cannot (and we commit to
> having ChronoUnit be a superset of TimeUnit, in perpetuity;
> toChronoUnit will forever be an injective function).
>
> Index: src/main/java/util/concurrent/TimeUnit.java
> ===================================================================
> RCS file: /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/TimeUnit.java,v
> retrieving revision 1.47
> diff -u -r1.47 TimeUnit.java
> --- src/main/java/util/concurrent/TimeUnit.java 20 Sep 2015 17:03:23 -0000 1.47
> +++ src/main/java/util/concurrent/TimeUnit.java 29 Jan 2016 19:05:01 -0000
> @@ -6,6 +6,9 @@
>
> package java.util.concurrent;
>
> +import java.time.temporal.ChronoUnit;
> +import java.util.Objects;
> +
> /**
> * A {@code TimeUnit} represents time durations at a given unit of
> * granularity and provides utility methods to convert across units,
> @@ -361,4 +364,48 @@
> }
> }
>
> + /**
> + * Converts this {@code TimeUnit} to the equivalent {@code ChronoUnit}.
> + *
> + * @return the converted equivalent ChronoUnit
> + * @since 9
> + */
> + public ChronoUnit toChronoUnit() {
> + switch (this) {
> + case NANOSECONDS: return ChronoUnit.NANOS;
> + case MICROSECONDS: return ChronoUnit.MICROS;
> + case MILLISECONDS: return ChronoUnit.MILLIS;
> + case SECONDS: return ChronoUnit.SECONDS;
> + case MINUTES: return ChronoUnit.MINUTES;
> + case HOURS: return ChronoUnit.HOURS;
> + case DAYS: return ChronoUnit.DAYS;
> + default: throw new AssertionError();
> + }
> + }
> +
> + /**
> + * Converts a {@code ChronoUnit} to the equivalent {@code TimeUnit}.
> + *
> + * @param chronoUnit the ChronoUnit to convert
> + * @return the converted equivalent TimeUnit
> + * @throws IllegalArgumentException if {@code chronoUnit} has no
> + * equivalent TimeUnit
> + * @throws NullPointerException if {@code chronoUnit} is null
> + * @since 9
> + */
> + public static TimeUnit of(ChronoUnit chronoUnit) {
> + switch (Objects.requireNonNull(chronoUnit, "chronoUnit")) {
> + case NANOS: return TimeUnit.NANOSECONDS;
> + case MICROS: return TimeUnit.MICROSECONDS;
> + case MILLIS: return TimeUnit.MILLISECONDS;
> + case SECONDS: return TimeUnit.SECONDS;
> + case MINUTES: return TimeUnit.MINUTES;
> + case HOURS: return TimeUnit.HOURS;
> + case DAYS: return TimeUnit.DAYS;
> + default:
> + throw new IllegalArgumentException(
> + "No TimeUnit equivalent for " + chronoUnit);
> + }
> + }
> +
> }
> Index: src/test/tck/TimeUnitTest.java
> ===================================================================
> RCS file: /export/home/jsr166/jsr166/jsr166/src/test/tck/TimeUnitTest.java,v
> retrieving revision 1.25
> diff -u -r1.25 TimeUnitTest.java
> --- src/test/tck/TimeUnitTest.java 25 Apr 2015 04:55:31 -0000 1.25
> +++ src/test/tck/TimeUnitTest.java 29 Jan 2016 19:05:02 -0000
> @@ -14,6 +14,7 @@
> import static java.util.concurrent.TimeUnit.NANOSECONDS;
> import static java.util.concurrent.TimeUnit.SECONDS;
>
> +import java.time.temporal.ChronoUnit;
> import java.util.concurrent.CountDownLatch;
> import java.util.concurrent.TimeUnit;
>
> @@ -433,4 +434,49 @@
> assertSame(x, serialClone(x));
> }
>
> + /**
> + * tests for toChronoUnit.
> + */
> + public void testToChronoUnit() throws Exception {
> + assertSame(ChronoUnit.NANOS, NANOSECONDS.toChronoUnit());
> + assertSame(ChronoUnit.MICROS, MICROSECONDS.toChronoUnit());
> + assertSame(ChronoUnit.MILLIS, MILLISECONDS.toChronoUnit());
> + assertSame(ChronoUnit.SECONDS, SECONDS.toChronoUnit());
> + assertSame(ChronoUnit.MINUTES, MINUTES.toChronoUnit());
> + assertSame(ChronoUnit.HOURS, HOURS.toChronoUnit());
> + assertSame(ChronoUnit.DAYS, DAYS.toChronoUnit());
> +
> + // Every TimeUnit has a defined ChronoUnit equivalent
> + for (TimeUnit x : TimeUnit.values())
> + assertSame(x, TimeUnit.of(x.toChronoUnit()));
> + }
> +
> + /**
> + * tests for TimeUnit.of(ChronoUnit).
> + */
> + public void testTimeUnitOf() throws Exception {
> + assertSame(NANOSECONDS, TimeUnit.of(ChronoUnit.NANOS));
> + assertSame(MICROSECONDS, TimeUnit.of(ChronoUnit.MICROS));
> + assertSame(MILLISECONDS, TimeUnit.of(ChronoUnit.MILLIS));
> + assertSame(SECONDS, TimeUnit.of(ChronoUnit.SECONDS));
> + assertSame(MINUTES, TimeUnit.of(ChronoUnit.MINUTES));
> + assertSame(HOURS, TimeUnit.of(ChronoUnit.HOURS));
> + assertSame(DAYS, TimeUnit.of(ChronoUnit.DAYS));
> +
> + assertThrows(NullPointerException.class,
> + () -> TimeUnit.of((ChronoUnit)null));
> +
> + // ChronoUnits either round trip to their TimeUnit
> + // equivalents, or throw IllegalMonitorStateException.
> + for (ChronoUnit cu : ChronoUnit.values()) {
> + final TimeUnit tu;
> + try {
> + tu = TimeUnit.of(cu);
> + } catch (IllegalArgumentException acceptable) {
> + continue;
> + }
> + assertSame(cu, tu.toChronoUnit());
> + }
> + }
> +
> }
More information about the core-libs-dev
mailing list