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

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通用对象

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

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

相关文章

反应速度测试软件,用批处理实现的反应速度测试工具

::此工具在Win7和Vista下请使用管理员身份运行!echo offcd.>%windir%\time.logset n:startmode con cols45 lines14Title 反应速度测试工具color 8aset aset bset sset/a n1set t%time:~9,1%cls&echo.&echo.&echo.echo.echo.echo 反应速度测试工具ec…

Mac终端shell类型bash和zsh切换

查看shell类型 可以执行命令echo $SHELL,先查看终端类型。 bash: /bin/bash zsh: /bin/zsh shell类型切换命令 切换到bash 输入命令:chsh -s /bin/bash 切换到zsh 输入命令:chsh -s /bin/zsh 注意需要重启终端生效(强制退出后…

mysql没有开启binlog能恢复数据吗_一个妹纸rm -rf把公司整个数据库删没了...

经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。事故背景安排一个妹子在一台生产服务器上安装 Oracle&#x…

apache.camel_Apache Camel 2.19发布–新增功能

apache.camelApache Camel 2.19于2017年5月5日发布,大约在一段时间后,我做了一个小博客,介绍了该版本包含的值得注意的新功能和改进。 这是值得注意的新功能和改进的列表。 1. Spring Boot的改进 Camel 2.19版本已针对Spring Boot进行了许多…

头条号个人中心登录_头条号平台上线「插入小程序」功能

头条号平台上线「插入小程序」功能,创作者可在图文、小视频和自定义菜单中插入头条小程序,帐号服务能力和变现能力进一步提升。一、什么是「头条小程序」?「头条小程序」是为内容生产者提供的延伸变现工具,是对创作者内容服务的延…

stearm计算机验证码,steam账户名称怎么取,值得收藏

steam是计算机游戏界最大的数码发行平台,是一个游戏整合下载平台,很多喜欢玩游戏的朋友都会用这个软件,当然也不少刚开始使用这个软件的朋友,这些朋友因为才刚刚接触到这个软件所以不知道steam账户名称怎么取,不要担心…

macOS下配置环境变量/查看环境变量

文章目录macOS 下环境变量的配置文件解决环境变量在 zsh shell 无效的问题查看 macOS 全部环境变量设置系统环境变量设置用户环境变量macOS 下环境变量的配置文件 a. /etc/paths b. /etc/profile c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc /etc/…

jpa一级缓存和二级缓存_了解一级JPA缓存

jpa一级缓存和二级缓存我敢打赌,每个Java开发人员至少都听说过L1(又名EntityManager或Session)缓存。 但是您的理解水平足够好吗? 如果不确定,请考虑阅读这篇文章。 首先,我们需要知道持久性上下文是什么。…

造完家怎么拆东西_地弹簧玻璃门怎么拆?地弹簧玻璃门拆除注意事项有哪些?...

现如今,我们总可以看到玻璃门的身影,在我们的生活中,玻璃门可以说是随处可见。而对于安装玻璃门,大家了解多少呢?为了更好认识玻璃门,今天就带大家一起走进玻璃门的安装中,告诉大家怎么样拆卸和组装玻璃门…

dubbo provider异步_Dubbo学习(六) Dubbo面试问题

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务&#xff0c…

测试网页兼容软件,WEB测试兼容性

软件兼容性测试在目前软件测试领域占有很只要的地位,无论B/S架构还是C/S架构的软件都需要进行兼容性测试,充分保证产品的平台无关性,使用户群充分的感受到软件的友好。139WDA属于WEB产品,以下就来总结下WEB测试之兼容性测试。WEB兼…

Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

文章目录内连接 inner join示例外连接 outer joinleft outer join 左外连接示例right outer join 右外连接示例full outer join 全外连接示例外连接总结内连接 inner join 内连接又称为等值连接,语法结构: 表1 inner join 表2 on 条件 -- inner可以省略…

tf 矩阵行和列交换_TF-搞不懂的TF矩阵加法

看谷歌的demo mnist,卷积后加偏执量的代码h_conv1 tf.nn.relu(conv2d(x_image, W_conv1) b_conv1)h_pool1 max_pool_2x2(h_conv1)其中的x_image的维数是[-1, 28, 28, 1],W_conv1的维数是[5, 5, 1, 32], b的维数是[32]conv2d对x_image和W_conv1进行卷积…

kafka数据到flume_大数据摄取:Flume,Kafka和NiFi

kafka数据到flume初赛 在构建大数据管道时,我们需要考虑如何吸收出现在通常是Hadoop生态系统大门口的数据量,多样性和速度。 在决定采用哪种工具来满足我们的要求时,诸如可伸缩性,可靠性,适应性,开发时间成…

python如何打开json文件_如何使用python打开json文件?

工程_请求数据.json公司名称:{ "appKey": "9c9fa7201e90d3d96718bc3f36ce4cfe1781f2e82f4e5792996623b3b474fee2c77699eb5354f2136063e1ff19c378f0f6dd984471a38ca5c393801bffb062d6", "appId": "NMDPTRIAL_AutomotiveTesting_N…

手机热点总是正在连接服务器,手机热点用不了?可以尝试这个方法。

原标题:手机热点用不了?可以尝试这个方法。下班路上,上司突然打来“夺命连环call”,早上的方案需要赶紧改一下。无奈,只能拿出笔记本在地铁上临时办公,关键时候连接手机热点,却发现还是没网络。…

一年月份大小月口诀_大月小月口诀 什么意思 有多少天

大家都知道每年都有分为12个月,月份又被分为大月小月和平月,每种月份的天数都不一样,有许多人记不住哪些是大月,哪些是小月。其实大月小月是有口诀的,接下去就让老黄历带大家详细了解一下大小月的口诀以及天数吧。问&a…

Sublime Text for Mac 最新版安装后,无法搜索到Install Package的解决办法

打开命令面板搜索不到Install Package,说明没有安装Package Control。 如何安装Package Control? 首先打开Package Control中文镜像,打开后如下图所示: 点击「Install Now」后,如下图所示: 我们看到有两…

参数化测试 junit_使用JUnit 5进行更清洁的参数化测试

参数化测试 junit参数化单元测试的总体思路是对不同的数据运行相同的测试方法。 在JUnit 4中创建参数化测试远非完美。 现有体系结构存在许多问题:将参数定义为类字段,并需要使用构造函数来创建它们,参数化和非参数化测试不能混合在一个测试类…

python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境

本文为《爬着学Python》系列第十三篇文章。Python能在这几年火起来,靠的不是网上一大片的爬虫和服务器后端知识的应用(本专题就是这样的,这么说真的好吗?不过我们总得认清事实是吧。),靠的是Python搭上了大数据和人工智能的风。而…