diff --git a/fine-kryo/src/com/fr/third/org/objenesis/ObjenesisBase.java b/fine-kryo/src/com/fr/third/org/objenesis/ObjenesisBase.java index 2d4b2209f..2d08272c3 100644 --- a/fine-kryo/src/com/fr/third/org/objenesis/ObjenesisBase.java +++ b/fine-kryo/src/com/fr/third/org/objenesis/ObjenesisBase.java @@ -18,6 +18,7 @@ package com.fr.third.org.objenesis; import com.fr.third.org.objenesis.instantiator.ObjectInstantiator; import com.fr.third.org.objenesis.strategy.InstantiatorStrategy; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -28,11 +29,15 @@ import java.util.concurrent.ConcurrentHashMap; */ public class ObjenesisBase implements Objenesis { - /** Strategy used by this Objenesi implementation to create classes */ + /** + * Strategy used by this Objenesi implementation to create classes + */ protected final InstantiatorStrategy strategy; - /** Strategy cache. Key = Class, Value = InstantiatorStrategy */ - protected ConcurrentHashMap> cache; + /** + * Strategy cache. Key = Class, Value = InstantiatorStrategy + */ + protected Map> cache; /** * Constructor allowing to pick a strategy and using cache @@ -50,17 +55,17 @@ public class ObjenesisBase implements Objenesis { * @param useCache If {@link ObjectInstantiator}s should be cached */ public ObjenesisBase(InstantiatorStrategy strategy, boolean useCache) { - if(strategy == null) { + if (strategy == null) { throw new IllegalArgumentException("A strategy can't be null"); } this.strategy = strategy; - this.cache = useCache ? new ConcurrentHashMap>() : null; + this.cache = useCache ? new ConcurrentHashMap>() : null; } @Override public String toString() { return getClass().getName() + " using " + strategy.getClass().getName() - + (cache == null ? " without" : " with") + " caching"; + + (cache == null ? " without" : " with") + " caching"; } /** @@ -83,20 +88,29 @@ public class ObjenesisBase implements Objenesis { */ @SuppressWarnings("unchecked") public ObjectInstantiator getInstantiatorOf(Class clazz) { - if(clazz.isPrimitive()) { + if (clazz.isPrimitive()) { throw new IllegalArgumentException("Primitive types can't be instantiated in Java"); } - if(cache == null) { + if (cache == null) { return strategy.newInstantiatorOf(clazz); } - ObjectInstantiator instantiator = cache.get(clazz.getName()); - if(instantiator == null) { + ObjectInstantiator instantiator = cache.get(clazz); + if (instantiator == null) { ObjectInstantiator newInstantiator = strategy.newInstantiatorOf(clazz); - instantiator = cache.putIfAbsent(clazz.getName(), newInstantiator); - if(instantiator == null) { + instantiator = putIfAbsent(clazz, newInstantiator); + if (instantiator == null) { instantiator = newInstantiator; } } return (ObjectInstantiator) instantiator; } -} + + private ObjectInstantiator putIfAbsent(Class key, ObjectInstantiator newInstantiator) { + + ObjectInstantiator instantiator = cache.get(key); + if (instantiator == null) { + instantiator = cache.put(key, newInstantiator); + } + return instantiator; + } +} \ No newline at end of file