iguais gerados em Web Service Stub
-
21-08-2019 - |
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
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.