From f47614d0da610e01a518ab702c8023c981487365 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Fri, 18 Sep 2026 10:28:14 -0700 Subject: [PATCH] Add purity annotations to Comparator. --- .../share/classes/java/util/Comparator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/java.base/share/classes/java/util/Comparator.java b/src/java.base/share/classes/java/util/Comparator.java index 53c07a37638a..115b025326f7 100644 --- a/src/java.base/share/classes/java/util/Comparator.java +++ b/src/java.base/share/classes/java/util/Comparator.java @@ -161,6 +161,7 @@ public interface Comparator { * @throws ClassCastException if the arguments' types prevent them from * being compared by this comparator. */ + @Pure int compare(T o1, T o2); /** @@ -227,6 +228,7 @@ default Comparator reversed() { * @throws NullPointerException if the argument is null. * @since 1.8 */ + @SideEffectFree default Comparator thenComparing(Comparator other) { Objects.requireNonNull(other); return (Comparator & Serializable) (c1, c2) -> { @@ -252,6 +254,7 @@ default Comparator thenComparing(Comparator other) { * @see #thenComparing(Comparator) * @since 1.8 */ + @SideEffectFree default Comparator thenComparing( Function keyExtractor, Comparator keyComparator) @@ -276,6 +279,7 @@ default Comparator thenComparing( * @see #thenComparing(Comparator) * @since 1.8 */ + @SideEffectFree default > Comparator thenComparing( Function keyExtractor) { @@ -297,6 +301,7 @@ default > Comparator thenComparing( * @see #thenComparing(Comparator) * @since 1.8 */ + @SideEffectFree default Comparator thenComparingInt(ToIntFunction keyExtractor) { return thenComparing(comparingInt(keyExtractor)); } @@ -316,6 +321,7 @@ default Comparator thenComparingInt(ToIntFunction keyExtractor) { * @see #thenComparing(Comparator) * @since 1.8 */ + @SideEffectFree default Comparator thenComparingLong(ToLongFunction keyExtractor) { return thenComparing(comparingLong(keyExtractor)); } @@ -335,6 +341,7 @@ default Comparator thenComparingLong(ToLongFunction keyExtractor) * @see #thenComparing(Comparator) * @since 1.8 */ + @SideEffectFree default Comparator thenComparingDouble(ToDoubleFunction keyExtractor) { return thenComparing(comparingDouble(keyExtractor)); } @@ -352,6 +359,7 @@ default Comparator thenComparingDouble(ToDoubleFunction keyExtract * @see Comparable * @since 1.8 */ + @Pure public static > Comparator reverseOrder() { return Collections.reverseOrder(); } @@ -369,6 +377,7 @@ public static > Comparator reverseOrder() { * @see Comparable * @since 1.8 */ + @Pure @SuppressWarnings("unchecked") public static > Comparator naturalOrder() { return (Comparator) Comparators.NaturalOrderComparator.INSTANCE; @@ -391,6 +400,7 @@ public static > Comparator reverseOrder() { * {@code Comparator}. * @since 1.8 */ + @SideEffectFree public static Comparator<@Nullable T> nullsFirst(@Nullable Comparator comparator) { return new Comparators.NullComparator<>(true, comparator); } @@ -412,6 +422,7 @@ public static > Comparator reverseOrder() { * {@code Comparator}. * @since 1.8 */ + @SideEffectFree public static Comparator<@Nullable T> nullsLast(@Nullable Comparator comparator) { return new Comparators.NullComparator<>(false, comparator); } @@ -443,6 +454,7 @@ public static > Comparator reverseOrder() { * @throws NullPointerException if either argument is null * @since 1.8 */ + @SideEffectFree public static Comparator comparing( Function keyExtractor, Comparator keyComparator) @@ -478,6 +490,7 @@ public static Comparator comparing( * @throws NullPointerException if the argument is null * @since 1.8 */ + @SideEffectFree public static > Comparator comparing( Function keyExtractor) { @@ -501,6 +514,7 @@ public static > Comparator comparing( * @throws NullPointerException if the argument is null * @since 1.8 */ + @SideEffectFree public static Comparator comparingInt(ToIntFunction keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) @@ -522,6 +536,7 @@ public static Comparator comparingInt(ToIntFunction keyExtract * @throws NullPointerException if the argument is null * @since 1.8 */ + @SideEffectFree public static Comparator comparingLong(ToLongFunction keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) @@ -543,6 +558,7 @@ public static Comparator comparingLong(ToLongFunction keyExtra * @throws NullPointerException if the argument is null * @since 1.8 */ + @SideEffectFree public static Comparator comparingDouble(ToDoubleFunction keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable)