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这违反了合同。见答案