On Thu, 9 Feb 2023 16:20:31 GMT, Tingjun Yuan <[email protected]> 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