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

Reply via email to