Pregunta

Todo el servicio web-recibos generados por nuestro servidor remoto tiene un signo de igual método similar a éste:

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 utiliza en otro lugar en la clase. La forma en que lo veo, no es exactamente nula durante el cálculo de la "igualdad". Sin embargo, los iguales se declara synchronized. Por lo tanto sólo un hilo puede estar en ella en cualquier momento dado. No puedo ver, ¿por qué if (__equalsCalc != null) nunca debería ser cierto.

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

¿Fue útil?

Solución

Sospecho que está tratando de dejar de recursividad -. Si algo tiene en sí como clave, que no quiere que se recursivo para siempre

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

Lo que está generando este código? ¿Es un sistema de cosecha, o una pública? Si se trata de cosecha propia, es el desarrollador responsable todavía en la empresa?

EDIT: Bueno, ahora que sabemos que es WSDL2Java, la respuesta es (más o menos) en el código fuente :?

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

y, a continuación:

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

No es el más explicativo de los comentarios, pero al menos muestran que estábamos en el camino correcto pensar en la recursividad.

Otros consejos

El __equalsCal comportarse como una caché de 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 siento esto sería cierto si el

__equalsCalc = null;

No estaría allí, pero volviendo a comprobar el código, probablemente mi respuesta no es válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top