我们后端生成的所有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 生成的答案 0 :(得分:7)
我怀疑它正试图阻止递归 - 如果某些东西本身就是它的关键,你不希望它永远地递归。
然而,此时它使用参考相等性进行测试,这可能是不可取的。
生成此代码的原因是什么?它是一个本土系统,还是一个公共系统?如果它是本土的,开发人员是否还在公司负责?
编辑:好的,现在我们知道它是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(" }");
不是最明确的评论,但至少它们表明我们正在考虑递归。
答案 1 :(得分:-1)
__equalsCal表现为最后一次调用Equals的Cache。因此,如果使用相同参数调用同一实例中的两个调用equals方法,则方法将更快
编辑:对不起,如果
,这将是真的__equalsCalc = null;
不会出现,但重新检查你的代码,可能我的答案无效。