44import org .springframework .util .ReflectionUtils ;
55
66import java .lang .reflect .Field ;
7+ import java .util .HashMap ;
78import java .util .Map ;
89
910/**
1516 */
1617public class ObjectMerger <T > {
1718
18- private ObjectMapper objectMapper ;
19+ /**
20+ * Determines if a Map cache will be used for ObjectMergers.
21+ */
22+ private static boolean cacheEnabled = true ;
23+ private static Map <Object , ObjectMerger > objectMergerCache = new HashMap <>();
24+
25+ private static ObjectMapper objectMapper ;
1926 private Class <T > type ;
2027
28+
2129 private ObjectMerger (Class <T > type ) {
22- this . objectMapper = new ObjectMapper ();
30+ objectMapper = new ObjectMapper ();
2331 this .type = type ;
2432 }
2533
2634 /**
27- * Returns a new instance of ObjectMerger<T> of the given type as parameter.
35+ * Returns a new instance of ObjectMerger<T> of the given type as parameter OR
36+ * an existing instance created before.
2837 *
2938 * @param type a class to be merged with a Map of <String, Object>.
3039 * @return
3140 */
3241 public static ObjectMerger of (Class type ) {
33- return new ObjectMerger (type );
42+
43+ if (!cacheEnabled ) {
44+ // Cache is not enabled. A new instance is always created.
45+ return new ObjectMerger (type );
46+ }
47+
48+ if (!objectMergerCache .containsKey (type )) {
49+ ObjectMerger objectMerger = new ObjectMerger (type );
50+ objectMergerCache .put (type , objectMerger );
51+ // Cache enabled. Instance created (first request).
52+ return objectMerger ;
53+ }
54+
55+ // Cache enabled. Returning existing instance.
56+ return objectMergerCache .get (type );
3457 }
3558
3659 /**
@@ -52,4 +75,5 @@ public void mergeRequestBodyToGenericObject(Map<String, Object> objectMap, T obj
5275 ReflectionUtils .setField (field , objectToUpdate , newValue );
5376 });
5477 }
78+
5579}
0 commit comments