THRIFT-675. java: Generated findByValue() should just switch on value instead of mapping

This patch removes the map-based enum value lookup and replaces it with a static switch statement.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@899911 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index e2da877..d1142e7 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -396,22 +396,13 @@
   }
   f_enum << ";" << endl << endl;
 
-  indent(f_enum) << "private static final Map<Integer, "+ tenum->get_name() +
-    "> BY_VALUE = new HashMap<Integer,"+ tenum->get_name() +">() {{" << endl;
-  indent(f_enum) << "  for("+ tenum->get_name() +" val : "+ tenum->get_name() +".values()) {" << endl;
-  indent(f_enum) << "    put(val.getValue(), val);" << endl;
-  indent(f_enum) << "  }" << endl;
-  indent(f_enum) << "}};" << endl;
-
-  f_enum << endl;
-
   // Field for thriftCode
   indent(f_enum) << "private final int value;" << endl << endl;
 
   indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl;
   indent(f_enum) << "  this.value = value;" <<endl;
   indent(f_enum) << "}" << endl << endl;
- 
+
   indent(f_enum) << "/**" << endl;
   indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL." << endl;
   indent(f_enum) << " */" << endl;
@@ -424,7 +415,34 @@
   indent(f_enum) << " * @return null if the value is not found." << endl;
   indent(f_enum) << " */" << endl;
   indent(f_enum) << "public static "+ tenum->get_name() + " findByValue(int value) { " << endl;
-  indent(f_enum) << "  return BY_VALUE.get(value);" << endl;
+
+  indent_up();
+
+  indent(f_enum) << "switch (value) {" << endl;
+  indent_up();
+
+  value = -1;
+
+  for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
+    if ((*c_iter)->has_value()) {
+      value = (*c_iter)->get_value();
+    } else {
+      ++value;
+    }
+
+    indent(f_enum) << "case " << value << ":" << endl;
+    indent(f_enum) << "  return " << (*c_iter)->get_name() << ";" << endl;
+  }
+  
+  indent(f_enum) << "default:" << endl;
+  indent(f_enum) << "  return null;" << endl;  
+
+  indent_down();
+
+  indent(f_enum) << "}" << endl;
+  
+  indent_down();
+
   indent(f_enum) << "}" << endl;
 
   scope_down(f_enum);