6

从我们的后端生成的所有 webservice-stubs 都有一个类似于这个的 equals 方法:

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

有人可以向我解释一下的目的__equalsCalc吗?我只是不明白。它不在课堂上的其他地方使用。在我看来,在计算“平等”期间它并不完全为空。然而 equals 是声明的synchronized。因此,在任何给定时间只能有一个线程在其中。我看不出来,为什么if (__equalsCalc != null)应该永远是真的。

请告诉我我愚蠢的误解;-)

编辑:我是该项目的新手,因此我的回答可能是错误的。但是如果我正确地跟踪它,该方法是由axis-wsdl2java生成的

4

2 回答 2

7

我怀疑它试图停止递归 - 如果某物以自身为键,你不希望它永远递归。

但是,此时它使用引用相等来进行测试,这可能是不可取的。

生成此代码的原因是什么?它是一个本土系统,还是一个公共系统?如果是本土的,负责的开发商还在公司吗?

编辑:好的,现在我们知道它是 WSDL2Java,答案是(有点)在源代码中:

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

进而:

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

不是最具解释性的评论,但至少它们表明我们在考虑递归方面走在了正确的轨道上。

于 2008-12-15T10:07:37.137 回答
-1

__equalsCal 作为最后一次调用 Equals 的缓存。因此,如果使用相同的参数调用同一实例中对 equals 方法的两次调用,则该方法将更快

编辑:对不起,如果

__equalsCalc = null;

不会在那里,但重新检查您的代码,可能我的回答无效。

于 2008-12-15T10:03:52.467 回答