Domanda

Tutti i generato webservice-mozziconi dal nostro back-end ha di uguale-metodo simile a questa:

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

Qualcuno può spiegare a me il purpoise di __equalsCalc? Io proprio non capisco. Non viene utilizzato da qualche altra parte nella classe. Il modo di vedere, non è nullo esattamente durante il calcolo della "uguaglianza". Tuttavia l'uguale è dichiarata synchronized. Pertanto, solo un thread può essere in essa in un dato momento. Non riesco a vedere, perché if (__equalsCalc != null) dovrebbe mai essere vero.

Vi prego di mostrare il mio stupido malinteso; -)

EDIT: Sono nuovo di progetto e quindi la mia risposta può essere sbagliato. Ma se io traccio correttamente, il metodo è generato da assi-WSDL2Java

È stato utile?

Soluzione

Ho il sospetto che sta cercando di fermare la ricorsione -. Se qualcosa si ha come la sua chiave, non voglio che recurse sempre

Tuttavia, a quel punto usa uguaglianza riferimento per la prova, che non è forse auspicabile.

Ciò che sta generando questo codice? Si tratta di un sistema di home-grown, o di una pubblica? Se si tratta di home-grown, è lo sviluppatore responsabile ancora in azienda?

EDIT: Okay, ora che sappiamo che è WSDL2Java, la risposta è (quasi) nel codice sorgente :?

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

e poi:

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

Non il più esplicativo di commenti, ma almeno mostrano che eravamo sulla strada giusta pensando ricorsione.

Altri suggerimenti

Il __equalsCal comportarsi come una cache per l'ultima chiamata al Equals. Quindi, se due chiamate nella stessa istanza di uguale metodo vengono richiamati con lo stesso parametro del metodo sarà più veloce

EDIT: Spiacente, questo sarebbe vero se il

__equalsCalc = null;

Non ci sarebbe, ma ricontrollare il codice, probabilmente la mia risposta non è valido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top