Frage

Alle generierten Webservice-Stubs aus unserem Backend haben eine Gleichheits-Verfahren ähnlich wie diese:

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;
}

Kann mir bitte jemand die purpoise von __equalsCalc erklären? Ich verstehe es einfach nicht. Es ist nicht irgendwo sonst in der Klasse verwendet. So wie ich es sehe, ist es nicht null genau bei der Berechnung der „Gleichheit“. Allerdings ist das Gleichheits synchronized erklärt. Daher kann nur ein Thread zu einem bestimmten Zeitpunkt in ihm sein. Ich kann nicht sehen, warum if (__equalsCalc != null) immer wahr sein sollte.

Bitte zeigen Sie mir mein dummes Mißverständnis; -)

EDIT: Ich bin neu in das Projekt und kann daher meine Antwort falsch sein. Aber wenn ich es richtig verfolgen, wird das Verfahren erzeugt durch achsen wsdl2java

War es hilfreich?

Lösung

Ich vermute, dass es versucht, Rekursion zu stoppen -. Wenn etwas selbst als Schlüssel hat, Sie nicht wollen, es für immer Rekursion

Doch an diesem Punkt verwendet sie Referenz Gleichheit für den Test, die möglicherweise nicht erwünscht ist.

Was zu erzeugen diesen Code? Ist es ein Home-grown-System oder ein öffentlicher? Wenn es home-grown, ist der Entwickler verantwortlich noch im Unternehmen?

EDIT: Okay, jetzt, da wir wissen, dass es WSDL2Java ist, die Antwort ist (Art) in der Quellcode :

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

und dann:

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

Nicht die erläuternden Kommentare, aber zumindest sie zeigen wir auf dem richtigen Weg über Rekursion zu denken wären.

Andere Tipps

Die __equalsCal als Cache verhalten für den letzten Aufruf von Equals. Also, wenn zwei Anrufe in der gleichen Instanz Methode ist gleich mit dem gleichen Parameter aufgerufen das Verfahren schneller sein

EDIT: Sorry, das wäre der Fall, wenn die

__equalsCalc = null;

nicht da sein würde, aber der Code erneute Überprüfung, wahrscheinlich meine Antwort ist nicht gültig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top