java通用对象

所有对象共有的方法(第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提供,例如... 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通用对象

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

  1. string转成对象_详解Java I/O流(五),对象序列化

    对象序列化 什么是序列化和反序列化呢? 序列化就是将对象转成字节序列的过程,反序列化就是将字节序列重组成对象的过程. 在这里插入图片描述 为什么要有对象序列化机制 程序中的对象,其实是存在有内存中,当 ...

  2. JAVA类思维_面向对象思维 Java中的类和对象及其应用

    一.面向过程与面向对象 面向过程: 从事务执行者的角度思考问题,我该干什么  重点在过程----事务流程 面向对象: 从事务的指挥者角度思考问题,我应该找谁干什么  重点在对象 面向对象的优点: 1. ...

  3. 传递集合对象_面试必备——Java集合框架

    Java集合框架面试题 常见集合 集合可以看作是一种容器,用来存储对象信息. 数组和集合的区别: (1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射 ...

  4. java .class 实例对象_通过Class类获取对象(实例讲解)

    通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象. /** * Created by hunt on 2017/6/27. * ...

  5. java 并发变量_二、Java多线程编程 (对象及变量的并发访问)

    非线程安全 多个线程对同一个对象中的实例变量进行并发操作时会出现值被更改.值不同步的情况,进而影响程序的执行流程. 线程安全 线程安全就是获得实例变量的值是经过同步处理的.不会出现被更改不同步的情况. ...

  6. java创建一个不可变对象_如何在Java中创建不可变类?

    java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...

  7. java 类的子类对象_使用超类初始化子类对象Java

    本问题已经有最佳答案,请猛点这里访问. SuperClass object = new SubClass(); 为什么要使用一个超类来像上面那样实例化一个子类对象?因为我学会实例化对象的唯一方法是: ...

  8. java闭包矩阵_深刻理解Java闭包概念

    闭包又称词法闭包java 闭包最先定义为一种包含和的实体.闭包 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在.函数 解释二:闭包是函数和相关引用环境组成的实体.spa 注: ...

  9. java web面试_超实用的Java web面试题

    Java web面试题 1.Tomcat的优化经验 答:去掉对web.xml的监视,把jsp提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的jvm的内存 2.HTTP请求的GE ...

  10. java 动态绑定原理_详解Java动态绑定机制的内幕(图)

    在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...

最新文章

  1. mysql 导出用户权限_MySQL中导出用户权限设置的脚本分享
  2. P2324 骑士精神
  3. java代码_Java 代码优化
  4. oracle请求界面,Oracle EBS如何enable 请求界面 View XML按钮
  5. POJ 2480 Longge#39;s problem 积性函数
  6. [深度学习] 深度学习常见概念
  7. React Native/Android Studio (mac ) 查看 APP界面 对应 代码页 快捷方法
  8. 微机计算机继电保护原理,微机继电保护的装置构成
  9. 电子商务概论(农)之章节课后题
  10. BT软件系统包含哪些部分?BT技术如何突破运营商的封锁?
  11. kind多节点端口映射
  12. 浏览器调取摄像头人脸抓拍实现
  13. CGB2108day17
  14. C++ Programming Basic acknowledge
  15. 豆瓣读书top250数据爬取与可视化
  16. 蚂蚁研究员玉伯:我的技术人生答案
  17. 谈谈javascript中的多线程
  18. pixhawk(PX4)的一些论坛网站(包括中文版的PX4用户手册和PX4开发手册)
  19. BTT假币攻击事件细节披露及修复方案
  20. 合肥市2022年专利预审申请条件备案流程以及授权时间介绍

热门文章

  1. CF1612G Max Sum Array
  2. YBTOJ:卖猪问题(网络流)
  3. AGC002(D~F)【Kruskal重构树,博弈论,dp】
  4. P6122-[NEERC2016]Mole Tunnels【模拟费用流】
  5. 牛客练习赛79E-小G的数学难题【dp,单调队列】
  6. P3702-[SDOI2017]序列计数【矩阵乘法】
  7. jzoj6316-djq的朋友圈【状压dp】
  8. jzoj3913-艰难的选择【差分,统计】
  9. P1315,jzoj3029-观光公交【费用流】
  10. MySQL count()函数