深网网站,wordpress采集提交百度,网站开发硬件环境,上海人才网站首页java中精确地小数多年来#xff0c;我一直在处理旧版Java代码#xff0c;因此遇到了微妙的逻辑和性能问题#xff0c;这些问题可以追溯到不正确覆盖的Object.equals#xff08;Object#xff09;方法。 尽管“等于”方法背后的概念看似简单#xff0c;但Josh Bloch在《 有… java中精确地小数 多年来我一直在处理旧版Java代码因此遇到了微妙的逻辑和性能问题这些问题可以追溯到不正确覆盖的Object.equalsObject方法。 尽管“等于”方法背后的概念看似简单但Josh Bloch在《 有效Java》中指出“重写equals方法似乎很简单但是有很多方法可以弄错它其后果可能是可怕的。 避免问题的最简单方法是不重写equals方法在这种情况下每个实例仅等于其自身。” 在这篇文章中我看了一种使equals(Object)错误的“许多方法”之一无法完全比较被评估是否相等的两个对象的完全相同的特征。 下一个代码清单是针对MismatchedFieldAccessor类的。 此类的equals(Object)方法有缺陷因为它将类的直接属性someString与从另一个对象的getSomeString()检索的值进行比较。 在大多数Java类中将类的字段与其访问器/获取方法进行比较将可以正常工作因为访问器/获取方法只是返回关联的字段。 但是在此示例类中accessor / get方法的作用不只是简单地返回该字段而且还使该字段与equals(Object)方法中的get / accessor方法的比较不一致。 请注意此处不建议使用“ get”方法来执行此类操作而只是作为一个易于理解的示例而存在。 package dustin.examples.brokenequals;import java.util.Objects;/*** Demonstrate problem with mismatched field/accessor in* overridden equals(Object) implementation.*/
public final class MismatchedFieldAccessor
{private final String someString;public MismatchedFieldAccessor(final String newString){someString newString;}public String getSomeString(){return someString ! null ? someString : ;}Overridepublic boolean equals(final Object other){if (this other){return true;}if (other null || getClass() ! other.getClass()){return false;}final MismatchedFieldAccessor that (MismatchedFieldAccessor) other;return Objects.equals(this.someString, that.getSomeString());}Overridepublic int hashCode(){return someString ! null ? someString.hashCode() : 0;}
} 如果使用适当的单元测试进行测试上述类将失败。 下一个代码清单中列出的两个单元测试指出了类的equals方法的问题。 public void testEqualsOnConstructedWithNull()
{final MismatchedFieldAccessor accessor new MismatchedFieldAccessor(null);Assert.assertEquals(null, accessor.getSomeString());
}Test
public void testEqualsWithEqualsVerifier()
{EqualsVerifier.forClass(MismatchedFieldAccessor.class).verify();
} 上面显示的第一个单元测试失败并显示以下消息 java.lang.AssertionError:
Expected :null
Actual : 第二个单元测试利用方便的EqualsVerifier库来确定此equals(Object)实现的问题已添加重点 java.lang.AssertionError: Reflexivity: object does not equal an identical copy of itself:dustin.examples.brokenequals.MismatchedFieldAccessor0
If this is intentional, consider suppressing Warning.IDENTICAL_COPY
For more information, go to: http://www.jqno.nl/equalsverifier/errormessagesat nl.jqno.equalsverifier.EqualsVerifier.handleError(EqualsVerifier.java:381)at nl.jqno.equalsverifier.EqualsVerifier.verify(EqualsVerifier.java:367)at dustin.examples.brokenequals.MismatchedFieldAccessorTest.testEqualsWithEqualsVerifier(MismatchedFieldAccessorTest.java:36) 如果没有认真执行检查和测试 equals方法可能会变坏这是许多方法中的一种。 幸运的是解决此特定问题的方法很容易始终将要比较的两个实例的相同字段或相同方法的返回对象进行比较以确保相等。 在本文中使用的示例中直接比较两个“ someString”字段将使“ equals”方法正常工作。 翻译自: https://www.javacodegeeks.com/2016/12/compare-exactly-java-equals-methods.htmljava中精确地小数