@@ -38,6 +38,7 @@ public class IdentityService
3838 private final NodePathValueHolder <IdentityStrategy > nodePathStrategies = NodePathValueHolder
3939 .of (IdentityStrategy .class );
4040 private final Map <Class <?>, IdentityStrategy > typeStrategyMap = new HashMap <Class <?>, IdentityStrategy >();
41+ private final Map <Class <?>, IdentityStrategy > typeStrategyMapCache = new HashMap <Class <?>, IdentityStrategy >();
4142 private final TypePropertyResolver typePropertyResolver = new TypePropertyResolver ();
4243 private final ObjectDifferBuilder objectDifferBuilder ;
4344
@@ -67,15 +68,29 @@ public IdentityStrategy resolveIdentityStrategy(final DiffNode node) {
6768 * Resolves by type including subclasses / interfaces.
6869 *
6970 * @param aClass
70- * @return
71+ * @return never null, EQUALS_IDENTITY_STRATEGY if not found
7172 */
7273 private IdentityStrategy resolveTypeStrategy (final Class <?> aClass ) {
73- for (Class <?> keyClass : typeStrategyMap .keySet ()) {
74- if (keyClass .isAssignableFrom (aClass )) {
75- return typeStrategyMap .get (keyClass );
74+ // check cache
75+ IdentityStrategy ret = typeStrategyMapCache .get (aClass );
76+ 77+ if (ret == null ) {
78+ // not in cache, search
79+ for (Class <?> keyClass : typeStrategyMap .keySet ()) {
80+ if (keyClass .isAssignableFrom (aClass )) {
81+ ret = typeStrategyMap .get (keyClass );
82+ typeStrategyMapCache .put (aClass , ret );
83+ return ret ;
84+ }
7685 }
86+ // not found, use EQUALS_IDENTITY_STRATEGY
87+ ret = EQUALS_IDENTITY_STRATEGY ;
88+ typeStrategyMapCache .put (aClass , ret );
89+ return ret ;
90+ } else {
91+ // in cache, return
92+ return ret ;
7793 }
78- return null ;
7994 }
8095
8196 public IdentityStrategy resolveByCollectionElement (
0 commit comments