org.json.JSONObject是否会破坏Object.equals()合约?

时间:2016-07-27 06:47:23

标签: java android json

使用JSONObject,您可以:

JSONObject.NULL.equals(null); //returns true

JSONObject.NULL打破Object.equals()合同,至少看起来像是这样,因为

  

对于任何非空引用值x,x.equals(null)应返回false

这个类被如此广泛使用和支持的事实使我认为没有违规由于某种原因,是吗?

2 个答案:

答案 0 :(得分:1)

NULL-Object是一种模式,用于避免string之类的检查。 这是一回事。 if(object == null)只是一个名字。但是你真正拥有的不是NULL(null-reference),而是一个提供默认行为(非空引用)的对象。

答案 1 :(得分:1)

它明显违反了Object.equals(),因为

  • JSONObject.NULL不是 null ,而是新的Object()
  • 返回值为true而非false
源自

JSONObject.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()

Object似乎是

public boolean equals(Object o) {
    return this == o;
}

如果我们传递 null JSONObject.NULL equals()方法中 o == null 的额外比较将始终返回true。因此

JSONObject.NULL.equals(null); //Will return true