Java org.json.JSONObject是否破坏Object.equals()契约?
有了它,您可以:Java org.json.JSONObject是否破坏Object.equals()契约?,java,android,json,Java,Android,Json,有了它,您可以: JSONObject.NULL.equals(null); //returns true JSONObject.NULL破坏了Object.equals()契约,至少看起来是这样,因为 对于任何非空引用值x,x.equals(null)应返回false 这个类被如此广泛地使用和支持,这让我觉得它不会因为某种原因而违反规则,是吗?这是一种模式,用于避免像if(object==null)这样的检查。 这里也是一样。NULL只是一个名称。但是你真正拥有的不是真正的null(null
JSONObject.NULL.equals(null); //returns true
JSONObject.NULL
破坏了Object.equals()
契约,至少看起来是这样,因为
对于任何非空引用值x,x.equals(null)应返回false
这个类被如此广泛地使用和支持,这让我觉得它不会因为某种原因而违反规则,是吗?这是一种模式,用于避免像if(object==null)
这样的检查。
这里也是一样。
NULL
只是一个名称。但是你真正拥有的不是真正的null
(null引用),而是一个提供默认行为(非null引用)的对象。它显然违反了对象。equals()因为
- JSONObject.NULL不是NULL,而是一个新的
Object()
- 返回值为
而不是true
false
JSONObject.NULL
源代码如下所示&该值不为NULL
public static final Object NULL = new Object() {
@Override public boolean equals(Object o) {
return o == this || o == null; // API specifies this broken equals implementation
}
@Override public String toString() {
return "null";
}
};
equals()
来自对象
public boolean equals(Object o) {
return this == o;
}
JSONObject.null
equals()
方法中的o==null的附加比较如果通过null,将始终返回true
。因此
JSONObject.NULL.equals(null); //Will return true
由于JsonObject是一个容器,我不觉得这真的违反了约定,对于这种对象,equals用于检查包含的数据。因此,如果您无法测试“Null Json实例”是否为Null,那么您将遇到一些问题;)上面的代码在哪里@ViswanathLekshmanan这是net.sf.json.JSONObject,不是org.json。JSONObject@Orlangure这违反了合同。见答案