Effective Java笔记(10)覆盖 equals 时请遵守通用约定

基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特 阅读详情

        覆盖 equals 方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重 。 最容易避免这类问题的办法就是不覆盖 equals 方法,在这种情况下,类的每个实例都只与它自身相等。 如果满足了以下任何一个条件,这就正是所期望的结果 :

类的每个实例本质上都是唯一的 。 对于代表活动实体而不是值( value )的类来说确实如此 ,例如 Thread 。Object 提供的 equals 实现对于这些类来说正是正确的行为 。

类没有必要提供“逻辑相等”( logical equality )的测试功能 。 例如,java.util.regex.Pattern 可以覆盖 equals ,以检查两个 Patter口实例是否代表同一个正则表达式,但是设计者并不认为客户需要或者期望这样的功能 。 在这类情况之下,从 Object 继承得到的 equals 实现已经足够了 。

超类已经覆盖了 equals , 超类的行为对于这个类也是合适的 。 例如,大多数的Set 实现都从Abstract Set 继承 equals 实现,List 实现从 AbstractList 继承 equals 实现,Map 实现从 AbstractMap 继承 equals 实现 。

类是私有的 ,或者是包级私有的 , 可以确定它的 equals 方法永远不会被调用 。 如果你非常想要规避风险,可以覆盖 equals 方法,以确保它不会被意外调用:

@Override 
pub1ic boolean equals(Object o) {
    throw new AssertionError(); // Method is never called
}

        在覆盖 equals 方法的时候,必须要遵守它的通用约定 。 下面是约定的内容,来自Object 的规范 。

        equals 方法实现了等价关系( equi va lence relation ),其属性如下:

  1. 自反性( reflexive ) : 对于任何非 null 的引用值 x,x.equals(x )必须返回 true 。
  2. 对称性( symmetric ):对于任何非 null 的引用值 x 和 y ,当且仅当 y.equals(x )返回 true 时,x.equals(y )必须返回 true 。
  3. 传递性( transitive ) : 对于任何非 null 的引用值 x 、y 和 z ,如果 x.equals(y )返回true ,并且 y.equals(z )也返回 true ,那么 x.equals(z )也必须返回 true 。
  4. 一致性( consistent ): 对于任何非 nu ll 的 引用值 x 和 y ,只要 equals 的比较操作在对象中所用的信息没有被修改,多次调用 x.equals(y )就会一致地返回 true,或者一致地返回 false 。
  5. 对于任何非 null 的引用值 x, x.equals (null )必须返回 false 。

高质量 equals 方法的诀窍 :

1、 使用==操作符检查“参数是否为这个对象的引用” 。 如果是,则返回 true 。 这只不过是一种性能优化,如果比较操作有可能很昂贵,就值得这么做 。

2、使用 instanceof 操作符检查“参数是否为正确的类型” 。 如果不是,则返回 false 。一般说来,所谓“正确的类型”是指 equals 方法所在的那个类 。 某些情况下,是指该类所实现的某个接口 。如果类实现的接口改进了 equals 约定,允许在实现了该接口的类之间进行比较,那么就使用接口 。 集合接口如 Set 、List 、Map 和 Map. Entry 具有这样的特性 。

3、把参数转换成正确的类型 。 因为转换之前进行过且 stanceof 测试,所以确保会成功 。

4、对于该类中的每个“关键”( significant )域,检查参数中的域是否与该对象中对应的域相匹配。 如果这些测试全部成功, 则返回 true ;否则返回 false 。 如果第 2 步 中 的类型是个接口,就必须通过接口方法访问参数中的域;如果该类型是个类,也许就能够直接访问参数中的域,这要取决于它们 的可访问性 。

        有些对象引用域包含null可能是合法的,所以,为了避免可能导致 NullPointerException 异常,则使用静态方法 Objects.equals(Object , Object ) 来检查这类域的等同性 。

        在编写完 equals 方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的 ? 并且不要只是自问,还要编写单元测试来检验这些特性。

下面是最后的一些告诫 :

        覆盖 equals 时总要覆盖 hashCode。

        不要企图让 equals 方法过于 智能 。 如果只是简单地测试域中的值是否相等,则不难做到遵守 equals 约定 。 如果想过度地去寻求各种等价关系, 则很容易陷入麻烦之中 。 把任何一种别名形式考虑到等价的范围内,往往不会是个好主意 。 

        不要将 equals 声 明 中 的 Object 对象替换为其他的类型 。 

        总而言之,不要轻易覆盖 equals 方法,除非迫不得已 。 因为在许多情况下,从Object 处继承的实现正是你想要的 。 如果覆盖 equals ,一定要比较这个类的所有关键域,并且查看它们是否遵守 equals 合约的所有五个条款 。

Rk3568 百兆以太网RMII模式DTS配置详解 本文详细解析了RK3568芯片在百兆以太网RMII模式下的DTS配置方法,包括时钟树配置、PHY接口模式定义及实际工程中的进阶设置。通过实战案例和调试技巧,帮助开发者快速解决RMII模式下的常见问题,提升工业控制设备的网络稳定性。 阅读详情

相关推荐

高斯投影坐标正反算算法(python)

高斯坐标正反算算法,在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号。该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写, 用于课程实验学习。

weixin_64338372的博客 4588

《Effective Java》漫谈:继承带来的equals难题

传递性: 对于任何非空引用值 x、 y 和 z,如果 x.equals (y)返回 true,而 y.equals (z)返回 true,那么 x.equals (z)应该返回 true。对称性: 对于任何非空引用值 x 和 y,当且仅当 y.equals (x)返回 true 时,x.equals (y)应该返回 true。自反性: 对于任何非空引用值 x,x.equals (x)应该返回 true。对于任何非空的引用值 x,x.equals (null)应该返回 false。我们可以考虑这样修改。

neOO0的博客 204

Matlab实现POD本征正交分解数据降维模型

近年来,随着大数据时代的到来,各种复杂的工程问题产生了海量的高维数据,如何有效降维、提取数据中的关键信息成为了众多领域中的重要问题。在传统的数据降维方法中,PCTFA(主成分分析)是一种典型的统计方法,然而对于流体动力学等非线性问题,PCTFA在处理时可能失去部分物理意义,难以捕捉到系统的复杂性。在降维过程中,POD提取的主要特征通常是一组复杂的正交基函数,如何将这些结果有效地转化为直观且易于理解的物理意义,特别是在实际应用中,对该特征的理解和分析,依然是一个重要的课题。本项目的扩展性也得到了有效体现。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1216

《Effective Java》阅读笔记8 覆盖equals方法请遵守通用约定

1.序 2.不需要覆盖equals的情景 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Object提供的equals实现对于这些类来说正是正确的行为。 不关心类是否提供了“逻辑相等(logical equality)”的测试功能。例如,java.util.Random覆盖了equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这样的情况下,从Object继承得到的equals实现已经足

weixin_41563161的博客 353

保姆级避坑指南:用Docker在Ubuntu 22.04上部署Isaac Sim 5.1.0,搞定宇树G1仿真环境

本文提供了一份详细的保姆级避坑指南,帮助用户在Ubuntu 22.04上通过Docker部署Isaac Sim 5.1.0,并成功搭建宇树G1仿真环境。文章涵盖了环境准备、Docker与NVIDIA容器工具包的配置、Isaac Sim镜像的定制化拉取与配置,以及宇树G1仿真环境的实战调试,旨在帮助开发者高效解决部署过程中的常见问题。

weixin_33728268的博客 207

Android11,无障碍服务模拟多手势使用dispatchGesture时总是onCancelled

AccessibilityService的dispatchGesture去模拟多手势,总是onCancelled的一种解决办法

m0_49953943的博客 2102

effective java 第10条:覆盖equals时请遵守约定

最容易避免的方法就是不覆盖equals方法,在这种情况下,类的每个实例都只与它自身相等。希望知道它们在逻辑上是否相等,而不是想了解它们是否指向同一个对象,为了满足程序员的要求,不仅必须覆盖equals方法,而且这样做也可以使得这个类的实例可以用作映射表(map)的键(key),或者集合(set)的元素。绝对不要忽视这些规定,如果违反了,就会发现程序将会表现的不正常,甚至崩溃,而且很难找到崩溃的原因。4、类是私有的,或者是包级私有的,可以确定它的equals方法永远不会被调用。

passerby64的博客 177

URP Shader编程之自定义后处理单pass渲染(URP 14.x)

❌ 不要在里拿✅ 只在里拿RendererFeature 生命周期RTHandle 设计Blitter 的真实语义Shader 输入来源。

qq1342753906的博客 608

Java:Effective java学习笔记之 覆盖equals时请遵守通用约定

Java覆盖equals时请遵守通用约定覆盖equals时请遵守通用约定1、为什么要覆盖equals2、需要覆盖equals方法的时机2.1、不需要覆盖equals方法的情况2.2、需要覆盖equals方法的情况2.2.1、自反性2.2.2、对称性2.2.3、传递性2.2.4、一致性2.2.5、非空性3、高质量equals方法的几个注意点3.1、规范案例4、除了上述的注意点之外,下面给出一些整体的告诫:4.1、==和equals()的区别5、总结参考 覆盖equals时请遵守通用约定 1、为什么要覆盖equ

JMW1407的博客 600

madgwick算法基于MPU9250姿态融合漂移问题的原因

基于MPU9250的madgwick算法姿态漂移问题原因 0、声明 因为这个是现象是不是共性目前本人还没研究过,只是在个体问题研究的基础上得出的结论,或许我买到的MPU9250是一个盗版:),所以只具备参考性。 1、现象 使用MPU9250的加速度计、角速度计、磁力计(AK8963)原始数据输入到madgwick算法中,得到的姿态最终会在停止姿态变化后仍然漂移一小段时间。其中加速度计和角速度计读取速率为400hz,磁力计为100hz,加速度计采样范围±2g,角速度计采样范...

GreedyZombie的博客 3872

我在腾讯上构建了一个人人能用的机载适航知识库

当ChatGPT掀起生成式AI的浪潮时,工程师们发现了一个尴尬的现实:询问“如何编写软件合格审定计划”,AI的回答可能充满似是而非的术语,却无法精确关联FDO-178C的对应内容。现在市面上有许多的AI大模型+适航知识库的方案,之前我的文章介绍了一种本地大模型加知识库的解决方法。此外,ima知识库的容量大小可以到30GB(企鹅大气),只要管理好文件的格式,理论上是完全可以把机载适航相关的内容容纳进去的。后续会不断增加适航法规,适航规章,适航标准,适航书籍,适航相关的论文,以及网上其他一些优秀的内容。

qq_41854911的博客 1223

EffectiveJava学习笔记5:==与equals的区别,重写(覆盖)equals方法

1.equals和==的区别 其实实质上==和equals是一样的,都是比较两者相等就是判断是否指向同一对象的内存地址。但是equals方法多了几次判断 默认的equals方法,实际上是先比较两者的引用是否指向同一对象的地址(和“==”一样)。但是equals比较地址不同之后会再判断对象的值是否相同。下面是我的idea环境下的默认得String的equals方法,可以看出先是==比较地址,然后...

沙丁鱼的博客 271

码农新宠大对决:GitHub Copilot、通义灵码和CodeLlama谁主沉浮?

本文对三款主流AI编程工具GitHub Copilot、通义灵码和CodeLlama进行了全面对比分析。GitHub Copilot在多语言支持和代码质量上表现突出;通义灵码在中文理解和阿里云生态集成方面优势明显;CodeLlama则以开源可定制见长。文章从代码生成、理解能力、多语言支持、使用体验等维度展开评测,并结合实际案例说明不同开发者群体的适用选择。建议新手可优先考虑通义灵码,经验开发者适合GitHub Copilot,而有定制需求的企业团队则可选择CodeLlama。随着AI技术发展,这些工具将持续

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 675

覆盖equals时请遵守通用约定 《Effective Java》第三章第十条

关于 《Effective Java》第三章第十条:覆盖equals时请遵守通用约定 的学习

qq_47129343的博客 804

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt

对于eclipse覆盖equals方法就是Alt+Shift+S,而AS就是Alt+Insert。覆盖很简单,可是却容易导致错误,而且后果很严重。最容易避免的方法就是不覆盖,这样类就只与他自身相等。 如果满足了以下任何一个条件,那么覆盖equals就能达到期望了。 1、类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Obj

yancyang的博客 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Effective Java笔记 :覆盖 equals 时请遵守通用约定

在《Effective Java》中,是一个重要的指导原则。equals方法是 Java 对象中最核心的方法之一,正确地覆盖它不仅可以让程序运行更可靠,还能避免由于设计错误导致的潜在问题,例如违反对称性或一致性等。下面我们会详细讲解覆盖equals方法的通用约定、注意事项、以及一个示例实现。equalsequals方法在这一默认实现检查两个对象是否是(内存地址是否相同)。

eclipseC的博客 662

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Effective java 覆盖equals时请遵守通用约定

该篇博客主要阐述 1、不需要覆盖equals的情景 2、需要覆盖equals的情景 3、对5条通用约定的理解 4、实现高质量equals的诀窍 5、注意点 一、不需要覆盖equals的情景 1、类的每个实例本质上都是唯一的 对于代表活动实体而不是值(value)的类来说确实如此,比如Thread 2、不关心类是否提供了“逻辑相等”的测试功能 书本上的例子是java.util.Random覆盖equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这种

菜园子丶For丨丶Tomorrow的博客 165

《Effective Java》解读第10条:覆盖equals时请遵守通用约定

本文介绍了覆盖equals方法时应遵循的通用约定。在大多数情况下无需重写equals,但当类需要"逻辑相等"概念(如值类)时则需要覆盖。覆盖时必须满足五个特性:自反性、对称性、传递性、一致性和非空性。实现高质量equals方法的技巧包括:使用==检查自引用、instanceof验证类型、逐字段比较等,同时要注意处理null值和特殊类型。最后强调覆盖equals时必须同时覆盖hashCode,避免过度设计,并建议使用IDE工具生成后测试。

Cosmoshhhyyy的博客 935

跟我学(Effective Java 2)第8条:覆盖equals时请遵守通用约定

第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有很多覆盖方式会导致错误,并且后果非常的严重。最容易避免这类问题的办法就是补覆盖equals方法,在这种情况下,类的每个实例都只是与它自身相等。如果满足以下任何一个条件,这正是所期望的结果: 1 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说,例如Thread。Object提供的equ...

Dullon_jiang的博客 287

《Effective Java》读书笔记——覆盖equals时请遵守通用约定

equals()方法是Object类的方法,而Object是所有类的顶级父类,所有的类都会拥有Object的方法,也会拥有equals()方法。在Object类中,equals()方法的实现特别简单,比较的两个实例为同一个实例则相等。

J_Killer 499

《Effective Java》笔记之重写equals时要遵守的通用约定

最近在阅读鼎鼎大名的《Effective Java》,想把一些自己觉得比较经典的内容以笔记形式记录在博客中,这是第一篇,接下来一段时间会持续更新笔记。 重写quals方法看起来很简单,但是不正确的重写方式可能会导致错误,并且后果非常严重还不容易找到问题所在。 首先,要明白什么时候需要重写equals,什么时候不需要。 不需要重写equals的情况: 1。类的每个实例本质上都是唯一的。比如代

易水南风的专栏 635

Effective Java -- 对于所有对象都通用的方法 -- 覆盖equals时请遵守通用约定

第三章 对于所有对象都通用的方法 第十条 覆盖equals时请遵守通用约定 不要轻易覆盖 equals 方法,除非迫不得已。 如果覆盖 equals 方法,一定要比较所有关键域,并查看它们是否遵守合约的五个条款。

weixin_43164759的博客 195

Effective Java笔记第二章对所有对象都通用的方法第一节覆盖equals时请遵守通用约定

Effective Java笔记第二章对所有对象都通用的方法 第一节覆盖equals时请遵守通用约定 1.最容易避免覆盖equals方法错误的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只会与它自身相等,满足以下任何一个条件都不需要覆盖equals方法: 1)类的每个实例本质上都是唯一的:对于代表活动实体而不是值的类来说就是这样。 2)不关心类是否提供了"逻辑相等"的测试功能。 3)超类(被继承的类)已经覆盖了equals,从超类继承过来的行为对于子类也是适合的。 ...

zh123456_789的博客 217

Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请遵守通用约定

读书笔记 仅供参考不覆盖 equals 方法许多覆盖方式会导致错误,并且后果十分严重,最容易避免错误的方法就是不覆盖 equals 方法。每个类的实例都只与自身相等。 类的每个实例本质上都是唯一的 不关心类是否提供了“逻辑相等”的功能 超类已经覆盖了 equals,从超类继承过来的行为对子类也是合适的(例如 List 从 AbstractList 继承 equals) 如果类是私有的或包级私有,可以

wujunyucg的博客 241

笔记《Effective Java》02:对所有对象都通用的方法(文末抽奖)

然而,它没有达到这个目的,主要的缺陷是缺乏 clone 方法,而 Object 类中的 clone 方法是受保护的。相反,请使用基本类型的封装类中的静态compare方法,或使用Comparator接口中的比较器构造方法。他们不需要类型转换。Java8中,Comparator接口提供了一组比较构造器方法,这些比较器可以用来实现Comparable接口所要求的compareTo方法,不过性能上会稍微慢一些。虽然Object类提供了toString方法的一个实现,但他返回的字符串通常不是类的用户所希望看到的。

有一只柴犬的专栏 1301

读《Effective Java》笔记之 第八条:覆盖equals时请遵守通用约定

不应覆盖equals的情况 equals方法有许多覆盖方式都会导致错误,避免这种错误最简单的办法就是不覆盖equals方法。以下几种情况适合不去覆盖equals 类的每个实例本质上都是唯一的 不需要“逻辑相等”的概念 超类已经覆盖了equals,从超类继承过来的行为对子类也是合适的 类是私有或包级私有的,可以确定它的equals方法永远不会被调用;不过这种情况,显然应该覆盖equals方...

myco前的专栏 356
上一篇: Java8函数式编程(Lambda表达式)
下一篇: Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值