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

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中精确地小数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql删除完全重复数据库_MySQL中删除完全重复数据的准确SQL语句

案例:id姓名课程名称分数1张三数学692李四数学893张三数学69删除除了自动编号不同,其他都相同的学生冗余信息------------------------------------------------------------------------------------------------------按常理来说,这个sql语句应该是&am…

电商系统的商品规格设计方案

文章目录方案一方案二SKU 的规格值如何存储方案一 先维护一堆参数和规格,然后创建商品类目关联需要的参数和规格,这样发布该类目商品时,就可以填写相关的参数和规格了 查看交互原型 方案二 先维护一堆参数和规格,再维护类目属性…

flink和kafka区别_Apache Flink和Kafka入门

flink和kafka区别介绍 Apache Flink是用于分布式流和批处理数据处理的开源平台。 Flink是具有多个API的流数据流引擎,用于创建面向数据流的应用程序。 Flink应用程序通常使用Apache Kafka进行数据输入和输出。 本文将指导您逐步使用Apache Flink和Kafka。 先决条件…

solr cloud 更新 solrconfig 配置_Solr各版本新特性「4.x,5.x,6.x,7.x」

一.Solr4.x新特性1.近实时搜索Solr的近实时搜索【Near Real-Time,NRT】功能实现了文档添加到搜索的快速进行,以应对搜索快速变化的数据。2.原子更新与乐观并发原子更新功能允许客户端应用对已有文档上进行添加、更新、删除和对字段增值等操作&#xff0c…

电商系统的商品流水记录

商品销售流水 销售单变成“归档”之后,系统生成相关商品的销售流水记录,这里要考虑退货扣减的问题也可以不生成相应的流水记录,直接从销售子单取相关数据显示即可 商品出库流水 出库单变成“已出库”后,系统生成相关商品的出库…

junit数据驱动测试_使用Junit和Easytest进行数据驱动的测试

junit数据驱动测试在本文中,我们将看到如何使用Junit进行数据驱动的测试。 为此,我将使用一个名为EasyTest的库。 我们知道,对于TestNG,它已内置了数据提供程序。 通过简单的测试,我们可以使用Junit进行数据驱动的测试…

centos rpm安装mysql5.5_CentOS下以RPM方式安装MySQL5.5

首先去mySQL官网下载页面:http://dev.mysql.com/downloads/mysql/#downloadsSelect Platform 选择 Oracle & Red Hat Linux 4 & 5分别下载以下三个文件(由于我的机器是32位,下面是32位版本的包,如果你的机器是64位的请下载64位版本)…

HH SaaS电商系统的出库功能模块设计

文章目录出库单业务流程基本流程扩展流程找不到符合条件的仓库,要求部分退款(未生成出库单时)找不到符合条件的仓库,全部退款(未生成出库单时)找不到符合条件的仓库,等待库存补足(未…

java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?

java 拼图JDK 9发行日期推迟到2017年7月 距JDK 9发行不到200天,它又被推迟了 。 新的发布日期已更新为2017年7月,比之前推迟的日期晚了四个月。 推迟日期 9月13日,Oracle Java平台小组的首席架构师Mark Reinhold发表了他的建议,…

mysql数据库增删改查关键字_mysql数据库的增删改查

数据库基本操作:增删改查#DML语言/*数据操作语言:插入:insert修改:update删除:delete*/1.增插入语句的方式一表已经存在啦,我们需要往里面插入数据/*语法:insert into 表名(列名,…) values(值1…

HH SaaS电商系统的采购功能模块设计

文章目录如何生成采购单系统生成采购单的流程基本流程扩展流程找不到符合条件的供应商,要求部分退款(初次生成采购单时)找不到符合条件的供应商,要求全部退款(初次生成采购单时)指定供应商的库存不足&#…

本地缓存防止缓存击穿_防止缓存爆炸的快速提示

本地缓存防止缓存击穿在很多情况下,您都可以从应用程序中的常用对象缓存中受益,特别是在面向Web和微服务的环境中。 您可以在Java中执行的最简单的缓存类型可能是引入一个私有HashMap,在计算对象之前先查询该哈希表,以确保您不会重…

php mysql导出csv文件_详解PHP导入导出CSV文件

我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名、性别、年龄等信息。CREATE TABLE student (id int(11) NOT NULL auto_increment,name varchar(50) NOT NULL…

HH SaaS电商系统的入库功能模块设计

文章目录创建入库单的场景创建入库单的业务流程商品直接入库内部仓退货入库(内部仓)换货入库(内部仓)退货入库(外部仓)换货入库(外部仓)备货入库(内部仓)备货…

aws ecr_在ECR上推送Spring Boot Docker映像

aws ecr在先前的博客中,我们将Spring Boot应用程序与EC2集成在一起。 它是您可以在Amazon Web Services上进行的最原始的部署形式之一。 在本教程中,我们将使用我们的应用程序创建一个docker映像,该映像将存储到Amazon EC2容器注册表中 。 …

HH SaaS电商系统的商品营销角标功能模块设计

1、角标只属于商城,自营店铺共享商城的角标,第三方店铺可以申请角标 2、角标跟着素材模板走,关联素材模板id,一对多关系

python为什么这么小_同样是 Python,怎么区别这么大

发现问题上周,我的测试同事告诉我,你的用户名怎么还允许中文啊?当时我心里就想,你们测试肯定又搞错接口了,我用的是正则\w过滤了参数,怎么可能出错,除非Python正则系统出错了,那是不…

dynamodb容器使用_使用DynamoDBMapper扫描DynamoDB项目

dynamodb容器使用之前,我们介绍了如何使用DynamoDBMapper或底层Java api查询DynamoDB数据库。 除了发出查询之外,DynamoDB还提供扫描功能。 扫描的目的是获取您在DynamoDB表上可能拥有的所有项目。 因此,扫描不需要任何基于我们的分区键或…

HH SaaS电商系统的商品营销标签功能模块设计

1、营销标签只属于商城,自营店铺共享商城的营销标签,第三方店铺可以申请营销标签 2、营销标签跟着商品走,关联spu_ext_id,多对多关系 3、一个商品最多添加5个营销标签

python加减法计算题 代码_关于《剑指offer》中不用加减乘除做加法的Python代码的问题...

题目如下:写一个函数,求两个整数之和,要求在函数体内不得使用、-、*、/四则运算符号。题目不难,可以采用位操作来实现,利用异或运算来计算不带进位的加法结果,利用与运算计算进位的标志,然后将这…