4
4
import org .springframework .util .ReflectionUtils ;
5
5
6
6
import java .lang .reflect .Field ;
7
+ import java .util .HashMap ;
7
8
import java .util .Map ;
8
9
9
10
/**
15
16
*/
16
17
public class ObjectMerger <T > {
17
18
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 ;
19
26
private Class <T > type ;
20
27
28
+
21
29
private ObjectMerger (Class <T > type ) {
22
- this . objectMapper = new ObjectMapper ();
30
+ objectMapper = new ObjectMapper ();
23
31
this .type = type ;
24
32
}
25
33
26
34
/**
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.
28
37
*
29
38
* @param type a class to be merged with a Map of <String, Object>.
30
39
* @return
31
40
*/
32
41
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 );
34
57
}
35
58
36
59
/**
@@ -52,4 +75,5 @@ public void mergeRequestBodyToGenericObject(Map<String, Object> objectMap, T obj
52
75
ReflectionUtils .setField (field , objectToUpdate , newValue );
53
76
});
54
77
}
78
+
55
79
}
0 commit comments