From 2390a77789570a2767ebca21da7c2a5675cff76f Mon Sep 17 00:00:00 2001 From: Daniel Fuchs Date: Tue, 24 Feb 2015 21:51:45 +0100 Subject: [PATCH] 8073394: Clock.systemUTC() should return a constant Clock.systemUTC() now returns SystemClock.UTC Reviewed-by: scolebourne, rriggs, plevart, lancea --- .../share/classes/java/time/Clock.java | 7 ++++- .../time/test/java/time/TestClock_System.java | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/jdk/src/java.base/share/classes/java/time/Clock.java b/jdk/src/java.base/share/classes/java/time/Clock.java index 28dd55f9b8d..6402806070d 100644 --- a/jdk/src/java.base/share/classes/java/time/Clock.java +++ b/jdk/src/java.base/share/classes/java/time/Clock.java @@ -155,7 +155,7 @@ public abstract class Clock { * @return a clock that uses the best available system clock in the UTC zone, not null */ public static Clock systemUTC() { - return new SystemClock(ZoneOffset.UTC); + return SystemClock.UTC; } /** @@ -198,6 +198,9 @@ public abstract class Clock { */ public static Clock system(ZoneId zone) { Objects.requireNonNull(zone, "zone"); + if (zone == ZoneOffset.UTC) { + return SystemClock.UTC; + } return new SystemClock(zone); } @@ -451,6 +454,8 @@ public abstract class Clock { private static final long serialVersionUID = 6740630888130243051L; private static final long OFFSET_SEED = System.currentTimeMillis()/1000 - 1024; // initial offest + static final SystemClock UTC = new SystemClock(ZoneOffset.UTC); + private final ZoneId zone; // We don't actually need a volatile here. // We don't care if offset is set or read concurrently by multiple diff --git a/jdk/test/java/time/test/java/time/TestClock_System.java b/jdk/test/java/time/test/java/time/TestClock_System.java index 527008920cc..b311dad6e6c 100644 --- a/jdk/test/java/time/test/java/time/TestClock_System.java +++ b/jdk/test/java/time/test/java/time/TestClock_System.java @@ -66,8 +66,10 @@ import java.lang.reflect.Field; import java.time.Clock; import java.time.Instant; import java.time.ZoneId; +import java.time.ZoneOffset; import org.testng.annotations.Test; +import org.testng.annotations.DataProvider; /** * Test system clock. @@ -76,6 +78,7 @@ import org.testng.annotations.Test; public class TestClock_System { private static final ZoneId PARIS = ZoneId.of("Europe/Paris"); + private static final Clock systemUTC = Clock.systemUTC(); public void test_withZone_same() { Clock test = Clock.system(PARIS); @@ -89,6 +92,32 @@ public class TestClock_System { assertEquals(test.toString(), "SystemClock[Europe/Paris]"); } + //----------------------------------------------------------------------- + @DataProvider(name="sampleSystemUTC") + Object[][] provider_sampleSystemUTC() { + return new Object[][] { + {"Clock.systemUTC()#1", Clock.systemUTC()}, + {"Clock.systemUTC()#2", Clock.systemUTC()}, + {"Clock.system(ZoneOffset.UTC)#1", Clock.system(ZoneOffset.UTC)}, + {"Clock.system(ZoneOffset.UTC)#2", Clock.system(ZoneOffset.UTC)} + }; + } + + // Test for 8073394 + @Test(dataProvider="sampleSystemUTC") + public void test_systemUTC(String s, Clock clock) { + if (clock != systemUTC) { + throw new RuntimeException("Unexpected clock instance for " + s + ": " + + "\n\texpected: " + toString(systemUTC) + + "\n\tactual: " + toString(clock)); + } + } + + private static String toString(Clock c) { + return c == null ? null : + c + " " + c.getClass().getName() + "@" + System.identityHashCode(c); + } + //----------------------------------------------------------------------- private static String formatTime(String prefix, Instant time) {