【问题标题】:Java 11: Strange behaviour with Object.equals() methodJava 11:Object.equals() 方法的奇怪行为
【发布时间】:2021-11-16 15:40:28
【问题描述】:

我正在编写一些从 Java 8 转移过来的 Java 11 测试代码。代码如下所示:

HttpsURLConnection urlc = setupURLConnection(url);
boolean eqs = urlc.equals(urlc);
assertFalse("Unexpected equals returned", eqs);

查看 Java 11 文档,它提到当对自身调用 equals 时,任何非空引用对象都应该返回 true。但是,在 Java 8 中,上述测试通过了测试,即上述测试确定 urlc 在 Java 8 中不等于自身,而在 Java 11 中,测试确定 urlc 等于自身。我还可以确认 equals 方法没有被任何东西覆盖,它只是标准的 Object.equals 方法。

哪个版本的测试是正确的,哪个是不正确的?是否有可能测试代码实际上是正确的,并且 Java 11 代码存在一些问题导致测试失败?感谢您的帮助!

【问题讨论】:

  • 那么setupURLConnection() 是做什么的?有人正在测试这样的东西这一事实意味着空气中有“创造力”,我并不是说好的方式。 HttpsURLConnection 是抽象的,如果你正在做一些非常奇怪的事情,你可以覆盖 equals() 来打破一般合同。

标签: java debugging testing


【解决方案1】:

已知错误

Java 8 版本已损坏,因为它违反了equals() 的合同。

创建 HttpsURLConnection 时实际得到的是一个 sun.net.www.protocol.https.HttpsURLConnectionImpl,它实际上有一个 equals() 方法:

public boolean equals(Object obj) {
    return delegate.equals(obj);
}

委托(通常是sun.net.www.protocol.https.DelegateHttpsURLConnection)反过来又正确实现了equals(),因此返回false,因为委托本身不是HttpsURLConnectionImpl的实例。

如果您的测试依赖于这种损坏的行为,那么您的测试也应该被认为是损坏的。

请参阅问题 # JDK-8055299、HttpsURLConnection.equals() broken。 Java 7 和 Java 8 中存在错误,在 Java 9 及更高版本中已修复。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多