THRIFT-701. java: Generated classes take up more space in jar than needed
authorBryan Duxbury <bryanduxbury@apache.org>
Tue, 23 Mar 2010 05:39:18 +0000 (05:39 +0000)
committerBryan Duxbury <bryanduxbury@apache.org>
Tue, 23 Mar 2010 05:39:18 +0000 (05:39 +0000)
Use a static {} block instead of an anonymous inner class to define metaDataMap. This saves some space in jars generated by avoiding the internal class.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@926466 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/generate/t_java_generator.cc

index 69bc6f9..c247921 100644 (file)
@@ -2007,14 +2007,17 @@ void t_java_generator::generate_java_meta_data_map(ofstream& out,
   vector<t_field*>::const_iterator f_iter;
 
   // Static Map with fieldID -> FieldMetaData mappings
-  indent(out) << "public static final Map<_Fields, FieldMetaData> metaDataMap = Collections.unmodifiableMap(new EnumMap<_Fields, FieldMetaData>(_Fields.class) {{" << endl;
+  indent(out) << "public static final Map<_Fields, FieldMetaData> metaDataMap;" << endl;
+  indent(out) << "static {" << endl;
+  indent_up();
+
+  indent(out) << "Map<_Fields, FieldMetaData> tmpMap = new EnumMap<_Fields, FieldMetaData>(_Fields.class);" << endl;
 
   // Populate map
-  indent_up();
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
     std::string field_name = field->get_name();
-    indent(out) << "put(_Fields." << constant_name(field_name) << ", new FieldMetaData(\"" << field_name << "\", ";
+    indent(out) << "tmpMap.put(_Fields." << constant_name(field_name) << ", new FieldMetaData(\"" << field_name << "\", ";
 
     // Set field requirement type (required, optional, etc.)
     if (field->get_req() == t_field::T_REQUIRED) {
@@ -2029,12 +2032,9 @@ void t_java_generator::generate_java_meta_data_map(ofstream& out,
     generate_field_value_meta_data(out, field->get_type());
     out  << "));" << endl;
   }
-  indent_down();
-  indent(out) << "}});" << endl << endl;
 
-  // Static initializer to populate global class to struct metadata map
-  indent(out) << "static {" << endl;
-  indent_up();
+  indent(out) << "metaDataMap = Collections.unmodifiableMap(tmpMap);" << endl;
+
   indent(out) << "FieldMetaData.addStructMetaDataMap(" << type_name(tstruct) << ".class, metaDataMap);" << endl;
   indent_down();
   indent(out) << "}" << endl << endl;