代码之家  ›  专栏  ›  技术社区  ›  Mo.

在Webservice存根中生成的相等项

  •  5
  • Mo.  · 技术社区  · 17 年前

    从后端生成的所有webservice存根都有一个与此类似的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 ? 我就是不明白。它不在课堂上的其他地方使用。在我看来,在计算“相等”的过程中,它并不是空的。然而,平等是被宣布的 synchronized . 因此,在任何给定的时间,其中只能有一个线程。 我看不见,为什么 if (__equalsCalc != null) 应该是真的。

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

    2 回复  |  直到 17 年前
        1
  •  7
  •   Dwhitz Brett Porter    6 年前

    然而,在这一点上,它使用参考等式进行测试,这可能是不可取的。

    编辑:好的,现在我们知道它是WSDL2Java,答案是(某种程度上)在 source code :

        // 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("        }");
    

    不是最具解释性的注释,但至少它们表明我们在考虑递归时走的是正确的道路。

        2
  •  -1
  •   David Santamaria    17 年前

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

    __equalsCalc = null;
    

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