当前位置:  开发笔记 > 编程语言 > 正文

Webservice Stub中生成的等号

如何解决《WebserviceStub中生成的等号》经验,为你挑选了1个好方法。

我们后端生成的所有webservice-stub都有一个类似于这个的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生成的



1> Jon Skeet..:

我怀疑它正试图阻止递归 - 如果有什么东西作为它的关键,你不希望它永远地递归.

但是,此时它使用参考相等性进行测试,这可能是不可取的.

是什么生成了这段代码?它是一个本土系统,还是一个公共系统?如果它是本土的,开发商是否还在公司负责?

编辑:好的,现在我们知道它是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("        }");

不是最明确的评论,但至少他们表明我们正在考虑递归.


你认为第二次空检查是多余的吗?:if(obj == null)返回false; http://codereview.stackexchange.com/questions/102669/null-check-in-equals-implementation
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有