2008-12-15 16 views
5

Todos los generados webservice-talones de nuestro backend tienen una igual método similar a éste:iguales generados en servicio web del trozo

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

¿Puede alguien explicarme la purpoise de __equalsCalc? Simplemente no entiendo. No se usa en otro lugar en la clase. De la forma en que lo veo, no es nulo exactamente durante el cálculo de la "igualdad". Sin embargo, los iguales se declaran synchronized. Por lo tanto, solo puede haber un hilo en un momento dado. No puedo ver, ¿por qué if (__equalsCalc != null) debería ser verdad?

Por favor, muéstrame mi estúpida malentendido ;-)

EDIT: Soy nuevo en el proyecto y por lo tanto mi respuesta puede estar equivocado. Pero si trazo correctamente, el método se genera por el eje-wsdl2java

Respuesta

6

Sospecho que está tratando de detener la recursión: si algo tiene como clave, no quiere que se repita para siempre.

Sin embargo, en ese punto utiliza igualdad de referencia para la prueba, lo que posiblemente no sea deseable.

¿Qué está generando este código? ¿Es un sistema nacional o público? Si es de cosecha propia, ¿el desarrollador sigue siendo responsable de la compañía?

EDIT: Bueno, ahora que sabemos que es WSDL2Java, la respuesta es (más o menos) en el source code:

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

y luego:

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

el más explicativo de los comentarios, pero al menos muestran que estábamos en el camino correcto pensando en la recursión.

+0

Supongo que tiene algo que ver con la recursión ... Pero no puedo entender qué es exactamente lo que intenta lograr –

+0

Por cierto, parece al igual que el código generado por WSDL2Java (http://www.google.com/search?q=__equalsCalc) –

+3

¿Cree que la segunda verificación nula es redundante ?: if (obj == null) return false; http://codereview.stackexchange.com/questions/102669/null-check-in-equals-implementation –

-1

El comportan __equalsCal como un caché para la última llamada a los Iguales. Por lo tanto, si dos llamadas en la misma instancia que es igual método se invoca con el mismo parámetro del método será más rápido

EDIT: Lo sentimos, este sería cierto si el

__equalsCalc = null; 

no estaría allí, pero volviendo a comprobar tu código, probablemente mi respuesta no sea válida.

+0

No, se establece en nulo antes de la declaración de devolución –

+0

Sí, simplemente se da cuenta de eso en el momento de Publicar la respuesta. Edita la respuesta para no confundir a nadie. –

+0

Estaba pensando lo mismo primero. Cuando vi la asignación nula estaba completamente perplejo y decidí publicar para publicar en SO –

Cuestiones relacionadas