所有对象共有的方法(第3章)

这是Joshua Blochs的《 有效的Java》第3章的简短摘要。我仅包括与自己相关的项目。

一般

等值合约将等价关系描述为:

  • x.equals(null) == false
  • 自反x.equals(x) == true
  • 对称 –如果x.equals(y) == truey.equals(x) == true
  • 可传递的 –如果x.equals(y) == truey.equals(z) == truex.equals(z) == true
  • 一致 –在相同的未修改对象上多次调用equals,返回相同的值。

有一些值得注意的属性可以改变:

  • 如果违反了以上约定,则其他对象(如List.contains() )的行为未定义。
  • 除非您愿意放弃OO抽象的优点,否则无法在保留等值关系的同时用新的值字段/组件扩展可实例化的类。
    • 注意,如果基类是抽象的,那就很好了。
  • java.net.URL依赖于与URL关联的主机的IP地址,这些主机需要网络访问,因此会破坏一致性。
  • 这本书给出了创建最佳等式的方法:
    1. 检查参数==this
    2. 使用的instance of检查类型是否正确
    3. 转换为正确的类型
    4. 比较重要领域

当您覆盖

哈希码由基于哈希的结构使用。 哈希码协定的最重要部分规定,相等的对象必须返回相等的哈希码。 此外,hashcode函数为不相等的对象返回不同的值,以提高性能。 如果没有正确的哈希码实现,则将相等的对象视为不相等的基于哈希的结构将表现不佳,甚至更糟。 如果将常量值作为hashCode提供,例如... return 42 ,则哈希表会退化为链接列表,并且程序应以线性时间运行,并以二次时间运行。

始终覆盖

…因为它使调试容易得多。

注意

实现Clonable使Object.clone()返回一个逐字段的副本,否则抛出CloneNotSupportedException 。 通常,克隆会创建一个对象,但会绕过构造函数。 实现clone存在若干挑战:

  • 通常,尤其是在扩展类时,在覆盖clone ,应返回super.clone()返回的对象以获取正确的类型。 这不是强制性的,它由用户决定,但是如果没有它,克隆可能会中断。
  • clone不会复制可变的对象字段,因此super.clone()将引用相同的对象字段。 必须手动克隆字段。
    • 从本质上讲,这意味着与克隆一起使用时,字段不能为“ final”,除非可以共享相同的字段值。
  • 由于clone在不使用构造函数的情况下创建对象,因此必须确保创建后所有不变式都是正确的。
  • 必须在内部列表/数组上递归调用clone

一般建议是避免使用和实现Object.clone() ,而是使用复制构造函数public Yum(Yum yum)或工厂,除非复制数组时。

实施

可比较处理订单比较,并且在使用例如TreeSetTreeMapsearchsort时是必需的。

  • 可比对象具有相似的合同,即equals ,如果被破坏,可能会导致行为不稳定。 合同要求对称,自反和传递。
  • equals是不符合compareTo可以创建一些集合重复。
  • Float和Double具有它们自己的静态compareTo方法,这些方法应简化处理浮点问题。
  • 减去整数以创建compareTo返回值时要小心,因为它可能会导致溢出(即在Integer.MAX_VALUE之外)并创建错误的返回值! 如果i为正值,而j为负值,则ij溢出并返回负值。

翻译自: https://www.javacodegeeks.com/2017/05/effective-java-method-common-objects.html

有效的Java –所有对象通用的方法相关推荐

  1. java通用对象_有效的Java –所有对象通用的方法

    java通用对象 所有对象共有的方法(第3章) 这是Joshua Blochs的有效Java第3章的简短摘要.我仅包含与自己相关的项目. 一般 等值合约将等价关系描述为: x.equals(null) ...

  2. 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)

    第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...

  3. 使用所有对象通用的方法

    本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您完成Java掌握的 ...

  4. java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它 ...

  5. 转载--编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    阅读目录 建议16:易变业务使用脚本语言编写 建议17:慎用动态编译 建议18:避免instanceof非预期结果 建议19:断言绝对不是鸡肋 建议20:不要只替换一个类 回到顶部 建议16:易变业务 ...

  6. 01-第一章 Java开发中通用的方法和准则

    建议1:不用在常量和变量中出现易混淆的字母 包括名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法(Camel Case)命名等. 例如: package com.compan ...

  7. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议6~10)...

    建议6:覆写变长方法也循规蹈矩 在JAVA中,子类覆写父类的中的方法很常见,这样做既可以修正bug,也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle). 符 ...

  8. 转载-----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议6~10)...

    阅读目录 建议6:覆写变长方法也循规蹈矩 建议7:警惕自增的陷阱 建议8:不要让旧语法困扰你 建议9:少用静态导入 建议10:不要在本类中覆盖静态导入的变量和方法 回到顶部 建议6:覆写变长方法也循规 ...

  9. 转载--编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议11~15)...

    阅读目录 建议11:养成良好习惯,显示声明UID 建议12:避免用序列化类在构造函数中为不变量赋值 建议13:避免为final变量复杂赋值 建议14:使用序列化类的私有方法巧妙解决部分属性持久化问题 ...

最新文章

  1. 这个假发太逼真!GAN 帮你换发型,alignment 步骤去掉生硬感
  2. 2021-03-10 Python多线程爬虫快速批量下载图片
  3. 《Altium Designer 14电路设计与仿真从入门到精通》——1.4 Altium电路板总体设计流程...
  4. 初涉.....编码__列表__字典
  5. 使用Emit反射建立运行时实体模型
  6. CDH5 Hadoop如何支持读写OSS
  7. 网页爬虫-八爪鱼Xpath自定义数字翻页
  8. 轻量级交通仿真——Flow
  9. jdbc连接oracle11g
  10. C++ Primer 读书笔记及知识点延伸 chapter2
  11. C语言牛客网(NowCoder)刷题篇
  12. hydra的基本使用
  13. 找回被盗iPhone的终极大招:查询ICCID
  14. android m和6.0的区别吗,清甜棉花糖:安卓M/Android 6.0上手体验评测
  15. 12、微信前端开发利器:WeUI
  16. 基于imx6q-Android6.0的ASOC架构 -- Machine部分(一)
  17. iview-admin 三级菜单路由
  18. Software Testing - 如何保证数据准确性
  19. css选择器下划线设置,css中怎么设置字体下划线
  20. 计算机外部设备有中央处理器吗,计算机外部设备

热门文章

  1. TCP 三次握手原理,你真的理解吗
  2. jQuery Raty星级评分插件使用方法
  3. Java魔法堂:URI、URL(含URL Protocol Handler)和URN
  4. java通过commons-fileupload实现多张图片的上传(servlet)
  5. IDEA把Springboot打成可执行jar包,内嵌tomcat 这个可以用
  6. AOP切点表达式及通知类参数传递方式
  7. java 验证码透明背景_Java中的证书透明度验证
  8. quartus状态机生成_生成器作为(快速失败)状态机
  9. oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?
  10. java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常