java中精确地小数

多年来,我一直在处理旧版Java代码,因此遇到了微妙的逻辑和性能问题,这些问题可以追溯到不正确覆盖的Object.equals(Object)方法。 尽管“等于”方法背后的概念看似简单,但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.MismatchedFieldAccessor@0
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.html

java中精确地小数

java中精确地小数_在Java等于方法中进行精确比较相关推荐

  1. Java用sqlit拆分小数_如何将SQLite列中的分隔值拆分为多列

    拉开一列是为Python非常简单(不确定关于SQLite).这将您的DB行简化为一个字符串数组,并且应该与SQLite返回类似. text = [ 'Apple', 'Banana, Pear', ' ...

  2. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  3. 根据下面一元二次方程求根公式,计算并输出一元二次方程x2+x-2=0的两个实根,要求精确到小数点后4位。程序中所有浮点数的数据类型均为float..

    根据下面一元二次方程求根公式,计算并输出一元二次方程x2+x-2=0的两个实根,要求精确到小数点后4位.程序中所有浮点数的数据类型均为float.. 输出格式: "x1=%.4f\n&quo ...

  4. python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...

    Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...

  5. java语言中声明布尔型_【Java初探02】——Java语言基础

    本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...

  6. java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...

    如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...

  7. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  8. 中去掉外键_【Java笔记】035天,MySQL中的增删改查

    学习Java的第35天. 今天天除了学习MySQL中的各种约束,MySQL中DML的操作,还有MySQL查询语句ds-- MySQLdz中d的约束有: • 非空约束(not null) • 唯一性约束 ...

  9. java中井号字符串_深入Java基础(二)——字符串

    这段时间在准备找一份java实习工作,所以来把基础知识整理归纳一下 文章结构: 1.equals和== 2.字符串的基本知识以及字符串的源码解读: 3.字符串的注意点以及使用推荐: 一.equals和 ...

最新文章

  1. python类中的属性分为类属性和实例属性两种_python中类和实例如何绑定属性与方法示例详解...
  2. 统计一个字符串中单词的个数
  3. OKEx比特币现金震荡 巴西央行公布新区块链项目
  4. 如何编码和解码base64字符串?
  5. Android SlidingMenu以及ActionBarSherlock的基础使用教程
  6. JavaScript从内容中筛选出手机号码集合
  7. lintcode-49-字符大小写排序
  8. 经典算法:牛顿迭代法求平方根
  9. dropout理解(一)
  10. 最小总代价(洛谷-U17433)
  11. 宏定义 是否retina高清屏,判断当前设备
  12. 协议处理程序初始化失败_域间路由协议的内容有哪些 域间路由协议的内容介绍【详解】...
  13. 微软“黑历史”:一个活了 45 年的愚蠢 Bug!
  14. Xcode8 报 ”xx“is missing from working copy 的问题解决方法
  15. 让2个并列的div根据内容自动保持同等高度js
  16. 一个程序员眼中的项目经理
  17. 【C语言程序设计】C语言求圆周率π(三种方法)
  18. Java开源CMS系统
  19. Windowsxp系统无法安装新字体
  20. 第三次个人作业—“K米”评测

热门文章

  1. 数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )
  2. CF235D-Graph Game【LCA,数学期望】
  3. CF835E-The penguin‘s game【交互】
  4. P2055-假期的宿舍【网络流,最大流,最大匹配】
  5. 【bfs】神殿(jzoj 2296)
  6. 【并查集】【图论】旅行(ssl 1312)
  7. GYM101933I - Intergalactic Bidding
  8. SpringCloud Greenwich(七)集成dubbo先启动消费者(check=false),然后启动提供者无法自动发现注册
  9. 作为一名Java程序员,你竟然不知道Instrumentation
  10. Idea Tomcat启动报异常CannotLoadBeanClassException