From: Robert Varga Date: Wed, 10 Aug 2022 21:25:14 +0000 (+0200) Subject: Seal SingletonSet X-Git-Tag: v10.0.0~85 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F44%2F102044%2F19;p=yangtools.git Seal SingletonSet 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 --- diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java b/common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java index c545692a17..1d9936cea3 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java @@ -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 implements Set, Immutable, Serializable { +public abstract sealed class SingletonSet implements Set, 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 spliterator() { - return SingletonSpliterators.immutableOfNull(); - } - - @Override - public @NonNull String toString() { - return "[null]"; - } - - @Serial - private Object readResolve() { - return NULL_SINGLETON; - } - }; - @SuppressWarnings("unchecked") public static @NonNull SingletonSet of(final @Nullable E element) { - return element == null ? (SingletonSet) NULL_SINGLETON : new RegularSingletonSet<>(element); + return element == null ? (SingletonSet) NullElement.INSTANCE : new Regular<>(element); } /** @@ -180,14 +143,47 @@ public abstract class SingletonSet implements Set, Immutable, Serializable } } + private static final class NullElement extends SingletonSet { + @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 spliterator() { + return SingletonSpliterators.immutableOfNull(); + } + + @Override + public String toString() { + return "[null]"; + } + } + @NonNullByDefault - private static final class RegularSingletonSet extends SingletonSet { + private static final class Regular extends SingletonSet { @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 implements Set, Immutable, Serializable } @Override - public E getElement() { + public @NonNull E getElement() { return element; }