On Mon, 30 Jan 2023 03:13:01 GMT, Glavo <d...@openjdk.org> wrote: > > > > Why not use set of classes? > > > > > > > > > Because some classes are not visible here (such as `Arrays.ArrayList`). > > > I'm not sure what the best choice is, so I'm trying to explore the > > > implementation plan. > > > > > > Only `Arrays.ArrayList` is not visible here. You can change it to > > package-private. > > Another problem is that use set of classes may cause unnecessary classes to > be loaded, which has a negative impact on startup speed. I want to do some > tests in the next few days.
Class constants don’t cause class initialization, only bare‑bones loading (in case `NoClassDefFoundError` needs to be thrown). -------------------------------------------------------------------------------- One option would be to move these sets into a method inner class, such as: static boolean isTrustedCollection(Collection<?> coll) { final class Holder { private static final Set<Class<? extends Collection<?>>> TRUSTED_COLLECTIONS = Set.of( // ... ); private static final Set<Class<? extends Map<?, ?>>> TRUSTED_MAPS = Set.of( // ... ); } if (coll.getClass().getModule() == Object.class.getModule()) { if (coll instanceof CollectionWrapper wrapper) { return isTrustedCollection(wrapper.getCollection()); } if (Holder.TRUSTED_COLLECTIONS.contains(coll.getClass().getName())) { return true; } if (coll instanceof ImmutableCollections.AbstractImmutableCollection<?>) { return true; } // Map keys set or entries set if (coll instanceof Set<?> && coll.getClass().isMemberClass()) { return Holder.TRUSTED_MAPS.contains(coll.getClass().getNestHost().getName()); } } return false; } ------------- PR: https://git.openjdk.org/jdk/pull/12212