[ https://issues.apache.org/jira/browse/THRIFT-2877?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15145901#comment-15145901 ]
ASF GitHub Bot commented on THRIFT-2877: ---------------------------------------- Github user nsuke commented on a diff in the pull request: https://github.com/apache/thrift/pull/448#discussion_r52825698 --- Diff: compiler/cpp/src/generate/t_java_generator.cc --- @@ -1886,24 +1889,57 @@ void t_java_generator::generate_java_struct_equality(ofstream& out, t_struct* ts bool can_be_null = type_can_be_null(t); string name = (*m_iter)->get_name(); - string present = "true"; + if (is_optional || can_be_null) { + indent(out) << "hashCode = hashCode * " << MUL << " + ((" << generate_isset_check(*m_iter) + << ") ? " << B_YES << " : " << B_NO << ");" << endl; + } if (is_optional || can_be_null) { - present += " && (" + generate_isset_check(*m_iter) + ")"; + indent(out) << "if (" + generate_isset_check(*m_iter) + ")" << endl; + indent_up(); } - indent(out) << "boolean present_" << name << " = " << present << ";" << endl; - indent(out) << "list.add(present_" << name << ");" << endl; - indent(out) << "if (present_" << name << ")" << endl; if (t->is_enum()) { - indent(out) << " list.add(" << name << ".getValue());" << endl; + indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".getValue();" << endl; + } else if (t->is_base_type()) { + switch(((t_base_type*)t)->get_base()) { + case t_base_type::TYPE_VOID: + break; --- End diff -- As this is a struct field, there should never be void ? I you agree, let's put similar exception to the one for `default:` below. > Optimize generated hashCode > --------------------------- > > Key: THRIFT-2877 > URL: https://issues.apache.org/jira/browse/THRIFT-2877 > Project: Thrift > Issue Type: Improvement > Components: Java - Compiler > Affects Versions: 0.9.3 > Reporter: Mike Rettig > Priority: Critical > > The generated java hashCode method allocates an ArrayList then appends the > fields to the list. Primitive fields will be boxed when added to the list. > The generated code shouldn't allocate a list or box primitives. The hashCode > can be calculated by using a primitive int and some static utility methods > which can return the hashCode for each type. > out << indent() << "@Override" << endl << indent() << "public int hashCode() > {" << endl; > 1839 indent_up(); > 1840 indent(out) << "List<Object> list = new ArrayList<Object>();" << endl; > 1841 > 1842 for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { > 1843 out << endl; > 1844 > 1845 t_type* t = get_true_type((*m_iter)->get_type()); > 1846 bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL; > 1847 bool can_be_null = type_can_be_null(t); > 1848 string name = (*m_iter)->get_name(); > 1849 > 1850 string present = "true"; > 1851 > 1852 if (is_optional || can_be_null) { > 1853 present += " && (" + generate_isset_check(*m_iter) + ")"; > 1854 } > 1855 > 1856 indent(out) << "boolean present_" << name << " = " << present << ";" > << endl; > 1857 indent(out) << "list.add(present_" << name << ");" << endl; > 1858 indent(out) << "if (present_" << name << ")" << endl; > 1859 if (t->is_enum()) { > 1860 indent(out) << " list.add(" << name << ".getValue());" << endl; > 1861 } else { > 1862 indent(out) << " list.add(" << name << ");" << endl; > 1863 } > 1864 } > 1865 > 1866 out << endl; > 1867 indent(out) << "return list.hashCode();" << endl; > 1868 indent_down(); > 1869 indent(out) << "}" << endl << endl; > 1870 } -- This message was sent by Atlassian JIRA (v6.3.4#6332)