我们后端生成的所有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生成的
我怀疑它正试图阻止递归 - 如果有什么东西作为它的关键,你不希望它永远地递归.
但是,此时它使用参考相等性进行测试,这可能是不可取的.
是什么生成了这段代码?它是一个本土系统,还是一个公共系统?如果它是本土的,开发商是否还在公司负责?
编辑:好的,现在我们知道它是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(" }");
不是最明确的评论,但至少他们表明我们正在考虑递归.