égaux générés dans Web Service Stub
-
21-08-2019 - |
Question
Toutes les souches de webservice généré à partir de notre back-end ont un signe égal méthode similaire à celle-ci:
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;
}
Quelqu'un peut-il s'il vous plaît me expliquer le purpoise de __equalsCalc
? Je ne comprends pas. Il ne sert pas ailleurs dans la classe. La façon dont je le vois, ce n'est pas exactement nulle lors du calcul de l ' « égalité ». Cependant, les égaux est déclaré synchronized
. Par conséquent, un seul thread peut être à tout moment donné.
Je ne vois pas, pourquoi ne devrait jamais être if (__equalsCalc != null)
vrai.
S'il vous plaît me montrer mon malentendu stupide; -)
EDIT: Je suis nouveau au projet et donc ma réponse peut-être tort. Mais si je trace correctement, la méthode est générée par axe wsdl2java
La solution
Je pense qu'il essaie d'arrêter récursion -. Si quelque chose a lui-même comme clé, vous ne voulez pas utiliser la récursivité pour toujours
Cependant, à ce stade, il utilise l'égalité de référence pour le test, ce qui est peut-être pas souhaitable.
Qu'est-ce qui générer ce code? Est-ce un système home-grown, ou un public? Si elle est de chez nous, est le développeur responsable encore à la société?
EDIT: D'accord, maintenant que nous savons qu'il est WSDL2Java, la réponse est (un peu) dans la section code source :
// The __equalsCalc field and synchronized method are necessary
// in case the object has direct or indirect references to itself.
et
// Have we been here before ? return true if yes otherwise false
pw.println(" if (__equalsCalc != null) {");
pw.println(" return (__equalsCalc == obj);");
pw.println(" }");
Pas le plus explicatif des commentaires, mais au moins ils montrent que nous étions sur la bonne voie à penser à récursivité.
Autres conseils
Le __equalsCal se comporte comme un cache pour le dernier appel à Equals. Ainsi, si deux appels dans la même instance pour Equals, méthode sont invoquées avec le même paramètre la méthode sera plus rapide
EDIT: Désolé, ce serait vrai si le
__equalsCalc = null;
ne serait pas là, mais revérifier votre code, sans doute ma réponse est non valide.