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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top