Seal SingletonSet 44/102044/19
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 10 Aug 2022 21:25:14 +0000 (23:25 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 17 Aug 2022 08:56:59 +0000 (10:56 +0200)
We cannot have an anonymous subclass and also seal it. Since we have
solved the writeout path, we can just rely on SSv1 to do the most of the
lifting and break the format.

Change-Id: I34177672db7a2f1d91731978205d20e76353aaa7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java

index c545692a173bca12f84d288851a0b69937d23911..1d9936cea32cc177096ba4b02c15461786f51eea 100644 (file)
@@ -28,50 +28,13 @@ import org.opendaylight.yangtools.concepts.Immutable;
  * element -- which is desirable in some situations, as is the case in {@link SharedSingletonMap#entrySet()}.
  */
 @Beta
-public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable {
+public abstract sealed class SingletonSet<E> implements Set<E>, Immutable, Serializable {
     @Serial
     private static final long serialVersionUID = 1L;
 
-    private static final SingletonSet<?> NULL_SINGLETON = new SingletonSet<>() {
-        @Serial
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        @SuppressWarnings("checkstyle:parameterName")
-        public boolean contains(final Object o) {
-            return o == null;
-        }
-
-        @Override
-        @SuppressWarnings("checkstyle:equalsHashCode")
-        public int hashCode() {
-            return 0;
-        }
-
-        @Override
-        public @Nullable Object getElement() {
-            return null;
-        }
-
-        @Override
-        public @NonNull Spliterator<Object> spliterator() {
-            return SingletonSpliterators.immutableOfNull();
-        }
-
-        @Override
-        public @NonNull String toString() {
-            return "[null]";
-        }
-
-        @Serial
-        private Object readResolve() {
-            return NULL_SINGLETON;
-        }
-    };
-
     @SuppressWarnings("unchecked")
     public static <E> @NonNull SingletonSet<E> of(final @Nullable E element) {
-        return element == null ? (SingletonSet<E>) NULL_SINGLETON : new RegularSingletonSet<>(element);
+        return element == null ? (SingletonSet<E>) NullElement.INSTANCE : new Regular<>(element);
     }
 
     /**
@@ -180,14 +143,47 @@ public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable
         }
     }
 
+    private static final class NullElement<E> extends SingletonSet<E> {
+        @Serial
+        private static final long serialVersionUID = 1L;
+        static final @NonNull NullElement<?> INSTANCE = new NullElement<>();
+
+        @Override
+        @SuppressWarnings("checkstyle:parameterName")
+        public boolean contains(final Object o) {
+            return o == null;
+        }
+
+        @Override
+        @SuppressWarnings("checkstyle:equalsHashCode")
+        public int hashCode() {
+            return 0;
+        }
+
+        @Override
+        public E getElement() {
+            return null;
+        }
+
+        @Override
+        public Spliterator<E> spliterator() {
+            return SingletonSpliterators.immutableOfNull();
+        }
+
+        @Override
+        public String toString() {
+            return "[null]";
+        }
+    }
+
     @NonNullByDefault
-    private static final class RegularSingletonSet<E> extends SingletonSet<E> {
+    private static final class Regular<E> extends SingletonSet<E> {
         @Serial
         private static final long serialVersionUID = 1L;
 
-        private final E element;
+        private final @NonNull E element;
 
-        RegularSingletonSet(final E element) {
+        Regular(final E element) {
             this.element = requireNonNull(element);
         }
 
@@ -198,7 +194,7 @@ public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable
         }
 
         @Override
-        public E getElement() {
+        public @NonNull E getElement() {
             return element;
         }