Pergunta

Todos os webservice-stubs gerados do nosso backend ter um igual-método semelhante a esta:

private java.lang.Object __equalsCalc = null;
public synchronized boolean equals(java.lang.Object obj) {
    if (!(obj instanceof PropertyData)) return false;
    PropertyData other = (PropertyData) obj;
    if (obj == null) return false;
    if (this == obj) return true;
    if (__equalsCalc != null) {
        return (__equalsCalc == obj);
    }
    __equalsCalc = obj;
    boolean _equals;
    _equals = true && 
        ((this.key==null && other.getKey()==null) || 
         (this.key!=null &&
          this.key.equals(other.getKey()))) &&
        ((this.value==null && other.getValue()==null) || 
         (this.value!=null &&
          this.value.equals(other.getValue())));
    __equalsCalc = null;
    return _equals;
}

Alguém por favor pode me explicar o purpoise de __equalsCalc? Eu só não entendo. Ela não é usada em outro lugar na classe. A forma como eu vejo, ele não é nulo exatamente durante o cálculo da "igualdade". No entanto, os iguais é declarado synchronized. Portanto, apenas um thread pode estar nele a qualquer momento. Eu não posso ver, por if (__equalsCalc != null) nunca deve ser verdade.

Por favor, mostre-me o meu mal-entendido estúpido; -)

EDIT: Eu sou novo para o projeto e, portanto, a minha resposta pode estar errado. Mas se eu segui-lo corretamente, o método é gerado pelo eixo wsdl2java

Foi útil?

Solução

Eu suspeito que ele está tentando parar de recursão -. Se algo tem-se como sua chave, você não quer que ele recurse para sempre

No entanto, nesse ponto ele usa igualdade de referência para o teste, o que possivelmente não é desejável.

O que está gerando esse código? É um sistema de home-grown, ou um público? Se for home-grown, é o desenvolvedor ainda responsável na empresa?

EDIT: Ok, agora que sabemos que é WSDL2Java, a resposta é (tipo de) na código fonte :

    // The __equalsCalc field and synchronized method are necessary
    // in case the object has direct or indirect references to itself.

e, em seguida:

    // Have we been here before ? return true if yes otherwise false
    pw.println("        if (__equalsCalc != null) {");
    pw.println("            return (__equalsCalc == obj);");
    pw.println("        }");

Não é o mais explicativo dos comentários, mas pelo menos eles mostram estávamos na pista pensamento correto sobre a recursividade.

Outras dicas

O comportar __equalsCal como um cache para a última chamada para Equals. Assim, se duas chamadas na mesma instância para método equals são invocados com o mesmo parâmetro do método será mais rápido

EDIT: Desculpe isso seria verdade se o

__equalsCalc = null;

não estaria lá, mas reverificação seu código, provavelmente, a minha resposta não é válido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top