performance: introduce COMPATIBILITY_MAP
diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Node.java b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
index f439e76..74bab56 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Node.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
@@ -136,7 +136,7 @@
if (useClassConstructor == null) {
if (isResolved() && !Object.class.equals(type) && !tag.equals(Tags.NULL)) {
return true;
- } else if (Tags.getCompatibleForTag(tag).contains(getType())) {
+ } else if (Tags.areCompatible(tag, getType())) {
// the tag is compatible with the runtime class
// the tag will be ignored
return true;
diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Tags.java b/src/main/java/org/yaml/snakeyaml/nodes/Tags.java
index 5019e50..ee504d5 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Tags.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Tags.java
@@ -18,10 +18,13 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
-import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+@SuppressWarnings("unchecked")
public final class Tags {
public static final String PREFIX = "tag:yaml.org,2002:";
public static final String MAP = PREFIX + "map";
@@ -39,6 +42,27 @@
public static final String MERGE = PREFIX + "merge";
public static final String VALUE = PREFIX + "value";
public static final String YAML = PREFIX + "yaml";
+ public static final Map<String, Set<Class>> COMPATIBILITY_MAP;
+ static {
+ COMPATIBILITY_MAP = new HashMap<String, Set<Class>>();
+ Set<Class> floatSet = new HashSet<Class>();
+ floatSet.add(Double.class);
+ floatSet.add(Float.class);
+ floatSet.add(BigDecimal.class);
+ COMPATIBILITY_MAP.put(FLOAT, floatSet);
+ //
+ Set<Class> intSet = new HashSet<Class>();
+ intSet.add(Integer.class);
+ intSet.add(Long.class);
+ intSet.add(BigInteger.class);
+ COMPATIBILITY_MAP.put(INT, intSet);
+ //
+ Set<Class> timestampSet = new HashSet<Class>();
+ timestampSet.add(Date.class);
+ timestampSet.add(java.sql.Date.class);
+ timestampSet.add(Timestamp.class);
+ COMPATIBILITY_MAP.put(TIMESTAMP, timestampSet);
+ }
public static String getGlobalTagForClass(Class<? extends Object> clazz) {
return PREFIX + clazz.getName();
@@ -47,29 +71,13 @@
// TODO is it the proper place for the code ?
// TODO should we define the preference which one is created when the
// runtime class is not known ?
- /**
- * Get list of classes which are constructed out of the same tag
- *
- * @param tag
- * - the tag with more then one matching Java class
- * @return
- */
- @SuppressWarnings("unchecked")
- public static List<Class> getCompatibleForTag(String tag) {
- List<Class> result = new ArrayList<Class>(3);
- if (TIMESTAMP.equals(tag)) {
- result.add(Date.class);
- result.add(java.sql.Date.class);
- result.add(Timestamp.class);
- } else if (FLOAT.equals(tag)) {
- result.add(Double.class);
- result.add(Float.class);
- result.add(BigDecimal.class);
- } else if (INT.equals(tag)) {
- result.add(Integer.class);
- result.add(Long.class);
- result.add(BigInteger.class);
+ // TODO choose a better name
+ public static boolean areCompatible(String tag, Class clazz) {
+ Set<Class> set = COMPATIBILITY_MAP.get(tag);
+ if (set != null) {
+ return set.contains(clazz);
+ } else {
+ return false;
}
- return result;
}
}