On Thu, 9 Feb 2023 16:20:31 GMT, Tingjun Yuan <d...@openjdk.org> wrote:
> Currently, the two subclasses of `java.util.EnumSet` optimize bulk operations > when the argument is also a `EnumSet`, but there is no such optimization for > wrapper sets (returned by `Collections.unmodifiableSet`, > `Collections.synchronizedSet`, etc.) and immutable sets (returned by `Set.of` > methods) of `Enum`s. > > This PR introduces optimization classes for these situations. No public APIs > are changed. src/java.base/share/classes/java/util/Collections.java line 1152: > 1150: if (s.getClass() == UnmodifiableSet.class) { > 1151: return (Set<T>) s; > 1152: } To avoid re‑wrapping already unmodifiable `EnumSet`s, this should also check for those: Suggestion: if (s.getClass() == UnmodifiableSet.class || s.getClass() == UnmodifiableRegularEnumSet.class || s.getClass() == UnmodifiableJumboEnumSet.class) { return (Set<T>) s; } src/java.base/share/classes/java/util/Collections.java line 1158: > 1156: if (s instanceof JumboEnumSetCompatible) { > 1157: return (Set<T>)new > UnmodifiableJumboEnumSet<>((JumboEnumSetCompatible<?>)s); > 1158: } Suggestion: if (s.getClass() == UnmodifiableSet.class || s.getClass() == UnmodifiableRegularEnumSet.class || s.getClass() == UnmodifiableJumboEnumSet.class) { return (Set<T>) s; } if (s instanceof RegularEnumSetCompatible<?> es) { return (Set<T>) new UnmodifiableRegularEnumSet<>(es); } if (s instanceof JumboEnumSetCompatible<?> es) { return (Set<T>) new UnmodifiableJumboEnumSet<>(es); } ------------- PR: https://git.openjdk.org/jdk/pull/12498