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;

     }

 }