有效的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函数为不相等的对象返回不同的值,以提高性能。 如果没有正确的哈希码实现,则将相等的对象视为不相等的基于哈希的结构将表现不佳,甚至更糟。 如果将常量值作为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

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

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

相关文章

几种页面置换算法

地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。常见的置换算法有&…

win7摄像头怎么开_win7网络连接不可用怎么办

win7网络连接不可用怎么办?网络出现故障最常见的就是网络明明连接上,但是依然提示网络连接不可用,小白系统遇到最常见的就是使用win7系统的用户反馈的,下面让小白系统教你解决win7网络连接不可用的问题吧。首先我们判断网络状态是…

cmake--安装

一, 目录结构 ├── cmake-examples.conf├── CMakeLists.txt├── include│ └── installing│ └── Hello.h└── src ├── Hello.cpp └── main.cpp * link:CMakeLists.txt[] - Contains the CMake commands yo…

ubuntu 关机重启

关机,重启 reboot (重启) shutdown -h now (立刻关机) shutdown -h 10 (10min后立刻关机) shutdown -h 20:05 (今天20:05立刻关机)

excel合并两列内容_excel新手问题:怎么把两列数据合并到一起?用这个公式

今天看见有新手在问:怎么把两列数据合并到一起?其实,这种情况在工作中会经常遇到,但很多人可能还在用复制粘贴的方法。只要掌握最简单的一个函数公式,就可以实现快速两列合并。第一步:掌握“&”运算符使…

Pycharm Anaconda 安装dlib

由于采用python3.7安装会出现各种问题,两种解决方法。 1)安装Cmake boost等(不推荐,麻烦且不容易成功)。 2)安装Anaconda,创建一个python3.6的环境。 这里使用第二种。 一、安装Anaconda 。 方法…

java 使用jasper_使用Jasper Reports以Java创建报告

java 使用jasper上周,我试图使用Jasper创建报告。 在这篇文章中,我将记录一些资源和链接,以便对任何寻求类似信息的人都有用。 我将介绍Jasper报告,示例和Dynamic Jasper的生命周期。 Jasper Reports是世界上最受欢迎的开源报告…

计算机科学基础知识(四): 动态库和位置无关代码

一、前言 本文主要描述了动态库以及和动态库有紧密联系的位置无关代码的相关资讯。首先介绍了动态库和位置无关代码的源由,了解这些背景知识有助于理解和学习动态库。随后,我们通过加-fPIC和不加这个编译选项分别编译出两个relocatable object file&…

安装后添加没有class library_《没有秘密的你》:戚薇曝光手机号,粉丝急忙添加后却甜哭了?...

现在大家对于戚薇都是非常熟悉的吧,现在她可以说是娱乐圈内非常受关注的一个明星了,因为自己的颜值和耿直的性格也是直接圈粉无数,当时自己没有很多名气的时候,更是因为自己的女儿增添了很多的人气。想必在今年夏天的时候&#xf…

ubuntu 硬盘使用情况

df (硬盘使用情况) df -h du (当前文件夹多大) du -h

执行器的Spring启动和安全性事件

Spring Boot Actuator提供了审核功能,用于在启用Spring Security的Spring Boot应用程序中发布和侦听与安全相关的事件。 默认事件是身份验证成功,身份验证失败和访问被拒绝,但是可以使用自定义事件进行扩展。 确保在项目中启用了Spring Boot…

docker 查看日志_8个优秀Docker容器监控工具,收藏了

Docker是目前使用最广泛的容器之一,但它并不总是像物理硬件一样可见。而使用docker容器监控工具有助于消除这种透明度的缺失。以下介绍8种优秀Docker容器监控工具。1.SolarWinds Server&Application MonitorSolarWinds Server&Application Monitor是一个应用…

ubuntu 打包压缩

打包 tar -cvf test.tar *.txt tar -cvf test.tar *.txt 解包 tar -xvf test.tar tar -xvf test.tar -C abc/ 解压到当前路径的abc目录下 打包压缩 tar -zcvf test.tar.gz *.txt 解压缩包 tar -zxvf test.tar -C abc/ 解压到当前路径的abc目录下 .tar.bz2格式…

计算机基础知识:什么是位、字节、字、KB、MB

位、字节、字、KB、MB 位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。 字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说&#xf…

Tr A(矩阵快速幂)

A为一个方阵&#xff0c;则Tr A表示A的迹&#xff08;就是主对角线上各项的和&#xff09;&#xff0c;现要求Tr(A^k)%9973。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。 每组数据的第一行有n(2 < n < 10)和k(2 < k < 10^9)两个数据。接下来有n行&am…

matlab中的方波信号图片_基于Matlab的雷达信号处理仿真

这是一个较为基础的图文教程(含仿真代码)&#xff1a;利用MATLAB设计经典的雷达数字信号处理。该系统具备对雷达目标回波的处理能力&#xff0c;能够从噪声中将目标检测出来&#xff0c;并提取目标的距离、速度、角度信息。教程分五节完成&#xff0c;主要包括&#xff1a;第一…

ubuntu find

find ./ -name “*.txt” find ./ -size 1M (当前目录下大小为1M) sudo find ./ -size 1M &#xff08;大小为1M&#xff0c;sudo为获取权限&#xff09; sudo find ./ -size 1M &#xff08;大于为1M&#xff09; sudo find ./ -size -1M &#xff08;小于1M&#xff09…

git clone 一些简单笔记

自使用了git后&#xff0c;就彻底喜欢上了&#xff0c;深深体会到了自由的感觉&#xff0c;记录一些简单的笔记和使用心得&#xff0c;仅供留迹&#xff0c;以备后查。。。 git clone 命令参数&#xff1a; usage: git clone [options] [--] <repo> [<dir>]-v, --v…

github上java_GitHub上Java的Bloom Bloom实现

github上java布隆过滤器是集数据结构的一种 。 对于那些不了解的对象&#xff0c;“设置数据结构”仅包含一个主要方法。 它仅用于确定特定元素是否包含在一组元素中。 大多数数据结构&#xff08;例如Hash Map &#xff0c; Linked List或Array &#xff09;都可以相当容易地创…