diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java index c19c7e84e..b4f26f20b 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java @@ -37,17 +37,26 @@ public interface CurrentDate extends TemporalExpression { * * @return an expression representing the current date. */ + @SuppressWarnings("unchecked") static CurrentDate now() { - return new CurrentDate<>() { - @Override - public Class type() { - return LocalDate.class; - } - - @Override - public String toString() { - return "LOCAL DATE"; - } - }; + return (CurrentDate) CurrentDateInstance.instance; + } +} + +// Internal implementation of single instance obtained from CurrentDate.now() +class CurrentDateInstance implements CurrentDate { + static final CurrentDate instance = new CurrentDateInstance(); + + private CurrentDateInstance() { + } + + @Override + public Class type() { + return LocalDate.class; + } + + @Override + public String toString() { + return "LOCAL DATE"; } } diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java index 6909f550c..8c05207b5 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java @@ -37,17 +37,27 @@ public interface CurrentDateTime extends TemporalExpression * * @return an expression representing the current date and time. */ + @SuppressWarnings("unchecked") static CurrentDateTime now() { - return new CurrentDateTime<>() { - @Override - public Class type() { - return LocalDateTime.class; - } - - @Override - public String toString() { - return "LOCAL DATETIME"; - } - }; + return (CurrentDateTime) CurrentDateTimeInstance.instance; } } + +// Internal implementation of single instance obtained from CurrentDateTime.now() +class CurrentDateTimeInstance implements CurrentDateTime { + static final CurrentDateTime instance = new CurrentDateTimeInstance(); + + private CurrentDateTimeInstance() { + } + + @Override + public Class type() { + return LocalDateTime.class; + } + + @Override + public String toString() { + return "LOCAL DATETIME"; + } +} + diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java index 7951886aa..77eb61813 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java @@ -37,17 +37,26 @@ public interface CurrentTime extends TemporalExpression { * * @return an expression representing the current time. */ + @SuppressWarnings("unchecked") static CurrentTime now() { - return new CurrentTime<>() { - @Override - public Class type() { - return LocalTime.class; - } - - @Override - public String toString() { - return "LOCAL TIME"; - } - }; + return (CurrentTime) CurrentTimeInstance.instance; + } +} + +// Internal implementation of single instance obtained from CurrentTime.now() +class CurrentTimeInstance implements CurrentTime { + static final CurrentTime instance = new CurrentTimeInstance(); + + private CurrentTimeInstance() { + } + + @Override + public Class type() { + return LocalTime.class; + } + + @Override + public String toString() { + return "LOCAL TIME"; } } diff --git a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java index ec759961a..f52867b99 100644 --- a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java +++ b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ */ package jakarta.data.expression; +import static org.assertj.core.api.Assertions.assertThat; + import jakarta.data.constraint.Between; import jakarta.data.constraint.LessThan; import jakarta.data.mock.entity.Book; @@ -24,6 +26,8 @@ import jakarta.data.restrict.BasicRestriction; import jakarta.data.restrict.Restriction; import jakarta.data.spi.expression.function.CurrentDate; +import jakarta.data.spi.expression.function.CurrentDateTime; +import jakarta.data.spi.expression.function.CurrentTime; import jakarta.data.spi.expression.literal.TemporalLiteral; import java.time.LocalDate; @@ -98,4 +102,22 @@ void shouldRestrictLocalDateBetween() { .isEqualTo(LocalDate.of(2025, Month.APRIL, 30)); }); } + + @Test + void testCurrentDateEqualsCurrentDate() { + assertThat(CurrentDate.now()) + .isSameAs(CurrentDate.now()); + } + + @Test + void testCurrentDateTimeEqualsCurrentDateTime() { + assertThat(CurrentDateTime.now()) + .isSameAs(CurrentDateTime.now()); + } + + @Test + void testCurrentTimeEqualsCurrentTime() { + assertThat(CurrentTime.now()) + .isSameAs(CurrentTime.now()); + } }