2008-12-15 8 views
5

Alle generierten Webservice-Stubs aus unserem Backend haben ein Gleichheits-Verfahren ähnlich wie diese:generiert Gleichen in Webservice Stub

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 jemand bitte die purpoise von __equalsCalc mir das erklären? Ich verstehe es einfach nicht. Es wird nirgendwo sonst in der Klasse verwendet. So wie ich es sehe, ist es bei der Berechnung der "Gleichheit" nicht genau null. Jedoch wird der Wert synchronized angegeben. Daher kann immer nur ein Thread darin enthalten sein. Ich kann nicht sehen, warum if (__equalsCalc != null) jemals wahr sein sollte.

Bitte zeigen Sie mir mein dummes Missverständnis ;-)

EDIT: Ich bin für das Projekt neu und daher kann meine Antwort falsch sein. Aber wenn ich es richtig trage, wird die Methode von axis-wsdl2java erzeugt

Antwort

6

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

Zu diesem Zeitpunkt verwendet es jedoch Referenzgleichheit für den Test, was möglicherweise nicht wünschenswert ist.

Was erzeugt diesen Code? Ist es ein selbstgewachsenes oder öffentliches System? Wenn es einheimisch ist, ist der verantwortliche Entwickler noch im Unternehmen?

EDIT: Okay, jetzt, da wir wissen, dass es WSDL2Java ist, die Antwort ist (Art) in den source code:

// 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 den erläuternden Kommentaren, aber zumindest zeigen sie, dass wir auf der richtigen Spur waren und über Rekursion nachdachten.

+0

zu posten, nehme ich an, es hat etwas mit Rekursion zu tun ... Aber ich kann nicht herausfinden, was genau es zu erreichen versucht –

+0

BTW, scheint Wie wird Code von WSDL2Java generiert? (http://www.google.com/search?q=__equalsCalc) –

+3

Glauben Sie, dass der zweite Null-Check überflüssig ist ?: if (obj == null) return false; http://codereview.stackexchange.com/questions/102669/null-check-in-equals-implementation –

-1

Die __equalsCal verhält sich wie ein Cache 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 seine

EDIT: Leider dies wahr wäre, wenn die

__equalsCalc = null; 

würde nicht da sein, aber rechecking Dein Code, wahrscheinlich ist meine Antwort nicht gültig.

+0

Nein, es wird auf Null vor der Rückmeldung gesetzt –

+0

Yep, nur darüber im Moment der Post die Antwort zu realisieren. Bearbeiten Sie die Antwort, um niemanden zu verwirren. –

+0

Ich dachte das gleiche zuerst. Als ich die Null-Zuordnung sah, war ich völlig verwirrt und beschloss, auf SO –