[JOHNZON-342] avoid too much reflection in PerHierarchyAndLexicographicalOrderFieldComparator
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
index 83f1deb..48948f6 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
@@ -19,9 +19,12 @@
package org.apache.johnzon.jsonb.order;
import java.util.Comparator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public class PerHierarchyAndLexicographicalOrderFieldComparator implements Comparator<String> {
private final Class<?> clazz;
+ private final Map<String, Integer> distances = new ConcurrentHashMap<>();
public PerHierarchyAndLexicographicalOrderFieldComparator(final Class<?> clazz) {
this.clazz = clazz;
@@ -29,6 +32,9 @@
@Override
public int compare(final String o1, final String o2) {
+ if (o1.equals(o2)) {
+ return 0;
+ }
final int d1 = distance(o1);
final int d2 = distance(o2);
final int res = d2 - d1; // reversed!
@@ -39,6 +45,10 @@
}
private int distance(final String o1) {
+ return distances.computeIfAbsent(o1, this::slowDistance);
+ }
+
+ private int slowDistance(String o1) {
Class<?> current = clazz;
int i = 0;
while (current != null && current != Object.class) {