确定Java等价性的新时代?

几个月前,我读了一篇题为“确定Java等价性的新时代?”的博客文章。 这在某种程度上与我当时在我那令人脚的副项目Java :: Geci中开发的内容非常吻合 。 我建议您暂停阅读,阅读原始文章,然后再返回此处,即使您知道一定比例的读者也不会回来。 这篇文章是关于如何在Java中正确实现equals()hashCode() ,以及一些有关应该如何实现或应该如何实现的思想。 在本文中,我将为那些不阅读原始文章的人详细介绍这些内容,并补充我的想法。 部分使用Java :: Geci的方式解决了这些问题,并且在本文结尾处,应如何在equals()hashCode()处理递归数据结构。 (请注意,就在我阅读文章的那一天,我也在完善mapper生成器以处理递归数据结构。这与我实际上正在解决的问题非常共鸣。)

如果您回来甚至没有读完原始文章,甚至连Liam Miller-Cushon所引用的JDK信函中的标题为“ 等效性 ”,在这里,您都可以从我的角度对最重要的陈述进行简短总结/从中学习文章:

  • 手动生成equals()hashCode()很麻烦。
  • 自Java 7以来,JDK就提供了支持,但是仍然存在方法的代码,并且必须对其进行维护。
  • IDE可以为这些方法生成代码,但是重新生成它们仍不是自动化过程,而手动执行重新生成是容易出错的维护过程。 (又名您忘记了运行发电机)

Liam Miller-Cushon的标题为“ Equivalence ”的JDK信件列出了equals()hashCode()实现中的典型错误。 值得在更多细节中重申这些内容。 (某些文字被逐字引用。)

  • “覆盖Object.equals(),但不覆盖hashCode()。 (Object.hashCode的合同规定,如果两个对象相等,则在两个对象中的每个对象上调用hashCode()方法必须产生相同的结果。实现equals()而不是hashCode()使得情况不太可能。)”,这是一个菜鸟错误,您可能会说您永远不会犯错。 是的,如果您是高级程序员,但在智力方面还不是高级,例如:忘记了牙齿修复的位置,那么您永远不会忘记在创建hashCode()时创建hashCode() equals() 。 但是请注意,这是生命中非常短暂的时间。 许多初级人员也构成了代码库,缺少的hashCode()可能总是潜伏在Java代码的干草堆深处,我们必须使用所有经济上可行的措施来避免它们不存在。
  • “等于无条件递归的实现。” 这是一个常见的错误,甚至老年人也多次忽略了这个可能的错误。 因为我们使用的数据结构通常不是递归的,所以这几乎不是问题。 当它们是递归的时, equals()hashCode()方法的粗心的递归实现可能会导致无限循环,堆栈溢出和其他不便之处。 我将在文章结尾讨论这个话题。
  • “比较不匹配的字段或吸气剂对,例如a == that.a && b == that.a. 这是一个主题输入错误,很容易像主题->典型那样被忽略。
  • 等于在给定null参数时抛出NullPointerException的实现。 (它们应该返回false。)
  • 等于在给定类型错误的参数时抛出ClassCastException的实现。 (它们应该返回false。)
  • 通过委派给hashCode()来实现equals() hashCode() 。 (哈希经常冲突,因此将导致误报。)
  • 考虑未在相应的equals()方法中测试的hashCode()中的状态。 (相等的对象必须具有相同的hashCode() 。)
  • 将引用相等或hashCode()用于数组成员的equals()hashCode()实现。 (他们可能打算使用值相等和hashCode() 。)
  • 其他错误(不在建议的范围之内):使用错误,例如比较两个静态不同的类型,或带有定义的非本地错误(例如,覆盖等号和更改语义,破坏可替换性)

我们如何避免这些错误? 一种可能性是增强语言,如所提到的建议所建议的那样,以便可以以声明的方式描述方法hashCode()equals() ,而实际的实现是常规且麻烦的,由编译器完成。 这是光明的未来,但我们必须等待。 Java因Swift整合思想而闻名。 当实现某些功能时,它将以向后兼容的方式永久保存。 因此,选择是快速实施它,可能以错误的方式实施并永久使用它。 或等到业界完全确定必须以哪种语言实现它,然后再到那时再实现它。 Java正在遵循第二种开发方式。

正如我在《 您的代码是多余的... 》一文中所描述的那样,这是语言发展引起的语言短缺。 暂时性的短缺将在以后解决,但就目前而言,我们必须处理这种短缺。

解决这种短缺的方法之一就是代码生成,这就是Java :: Geci出现的地方。

Java :: Geci是一个代码生成框架,非常适合创建代码生成器,以帮助减少针对特定领域问题的代码冗余。 代码生成器在单元测试执行期间运行,这可能会稍晚一些,因为代码已被编译。 但是,此问题已通过以下方式修复:如果“测试”的代码生成了任何代码并执行了编译,则生成“测试”的代码将失败,并且第二次测试也将不再失败。

旁注:这种工作方式可能对任何软件开发人员都非常熟悉:让我们再次运行它,可能会起作用!

从技术的角度来看,在编程语言发展不足的情况下,Java :: Geci也是一样。 出于特定领域的原因而生成的代码与出于语言演进不足的原因而生成的代码之间没有技术上的区别。 但是,在语言演变问题的情况下,您可能会找到其他也可以解决该问题的代码生成工具。 要生成equals()hashCode() ,可以使用集成开发环境。 没有什么比从IDE中选择菜单然后单击单击“生成等于和hashCode”更简单了。

假设生成的代码行为良好,这可以解决以上所有问题之一。 唯一的问题是,无论何时更新代码,它都不会再次运行代码生成器来更新生成的代码。 IDE无法与Java :: Geci竞争。 设置Java :: Geci框架的步骤比单击几个菜单项要多。 您需要测试依赖项,必须创建一个单元测试方法,并且必须注释需要生成器的类,或者,作为替代,您必须在包含生成代码的代码中插入一个编辑器折叠块。 但是,在那之后,您可以忘记生成器,而无需担心团队中的任何开发人员都忘记了重新生成equals()hashCode()方法。

带走

  • 为一个类拥有适当的equals()hashCode()方法并不像看起来那样简单。 手动编写它们几乎不是最好的方法。
  • 使用生成工具来生成它们,并确保所生成的代码和代码生成不会出现上述任何常见错误。
  • 如果只需要Q&D,则使用IDE菜单并生成方法。 另一方面,如果您有一个较大的代码库,并且有许多开发人员在其中工作,并且代码生成可能需要重新执行,则可以使用自动执行代码生成的工具。 示例:Java :: Geci。
  • 使用最新版本的工具(例如Java),以免落后于可用技术。

翻译自: https://www.javacodegeeks.com/2019/10/a-new-era-for-determining-equivalence-in-java.html

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

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

相关文章

oracle数据modeling分类,由浅入深 NoSQL的五种主流数据模型

【IT168 技术】本文内容是对《NoSQL Data Modeling Techniques》一文的简单概述,原文对NoSQL的几种数据模型进行了详细深入的讨论。是了解NoSQL数据模型不过错过的全面资料。NoSQL的一些非功能性的特性,比如扩展性、性能以及一致性的讨论,目前…

sklearn svm 调参_网舟科技 | 使用SVM模型进行分类预测时的参数调整技巧

原标题:网舟科技 | 使用SVM模型进行分类预测时的参数调整技巧SVM是一种在小样本低维度下比较适用的非线性建模方法,相对比其他常用的算法(比如决策树),模型根据调参的好坏所表现的性能波动非常大。当我们决定使用SVM模型,模型的效…

dederss.php美国与,Dede经验:全站rss/连载和分类首页模板替换

我用的是Dedecms55 utf-8建的站。首先感谢开源工作者们的劳动,其次要感谢使用者写的N多问题与解答。我一个PHP初用者,能在一个月内,一个人把酷猫网http://www.92kcuat.com 建成今天这样,相信很多朋友都可以。当遇到问题时&#xf…

物联网协议之COAP简介及Java实践

目录 前言 一、COAP简介 1、关于COAP 2、COAP特点 3、基于COAP的NB-IoT接入流程 二、CoAP协议JAVA实践 1、californium介绍 2、Java集成 3、Maven 资源引入 4、定义Server端 5、Client调用 6、运行测试 总结 前言 今天平安夜,祝大家圣诞快乐&#xff0c…

遗传算法可用什么算法代替_获取可用密码算法的列表

遗传算法可用什么算法代替您如何了解可用的密码算法? Java规范列出了几种必需的密码,摘要等,但是提供程序通常提供的不止这些。 幸运的是,这很容易了解我们系统上的可用内容。 public class ListAlgorithms {public static void…

bp配置 sap_SAP转储订单之 STO without delivery

在《SAP转储订单STO小结》一文中,介绍了存转储订单(STO)的几种方式,在SAP Library中有相应的描述:1 Stock Transfer Between Plants in One Step2 Stock Transfer Between Plants in TwoSteps3 Stock Transport Order Without Delivery4 Stoc…

高效的企业测试–测试框架(5/6)

本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的思考 我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了一些语法上的便利性和便利性,但本质上并不能解决拥有可维护的测…

linux 源码 目录,Linux系统主要目录及kernel源代码目录

1.在安装Linux后,先要了解清楚系统主要目录到底是干什么用的,避免以后再操作上的失误等。下面,就对Linux主要目录做一下简要说明:/boot:系统启动相关的文件,如内核、initrd,以及grub(bootloader…

[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)

通过超过62个小时的培训来掌握最流行的编程语言,从而树立良好的开发生涯 嘿,怪胎, 这一周,我们JCG促销专区 ,我们有另一个极端的报价 。我们正在提供一个巨大的96%off的完整2020 Python编程认证捆绑 。 立…

linux nc命令测试端口,Linux和Windows下的NC(Netcat)命令测试端口连通性

1、Linux OS 环境下(以Centos为例),使用nc命令分别测试TCP和UDP端口连通性:css安装方法:nginx在客户端和服务器端分别安装nc工具,安装命令以下:webyum install nc1. Linux OS下使用nc命令,实现TCP方式监听服…

javafx css颜色_JavaFX技巧7:使用CSS颜色常量/派生颜色

javafx css颜色在使用FlexCalendarFX时,我不得不定义一组颜色以可视化不同颜色的不同日历的控件。 每个日历不仅提供一种颜色,还提供几种:用于取消选择/选定/悬停状态的背景和文本颜色。 颜色曾在多个地方使用过,但为了简洁起见&…

rowspan不显示 wpf_wpf的datagrid绑定datatable列不自动更新解决方案

wpf的datagrid绑定datatable列不自动更新描述如下:想利用程序实现显示NORTHWND.MDF中的所有表。listbox显示数据库中的表清单,选中listbox里面的一项以后,在datagrid中显示表的内容。xaml如下:Grid.Column"1" ItemsSour…

linux 查看端口 程序,linux开发:Linux下查看端口占用

前段时间有学生问到,怎么查看linux系统中已经被占用的端口?下面就统一给大家解释一下。提到端口,那首先来回顾端口定义,为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别;我们…

十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...

先来看八进制如何转换成十进制。其方法与二进制转换成十进制差不多:按权相加法,即将八进制每位上的数乘以位权(如8,64,512….),然后将得出来的数再加在一起。如将72.45转换为十进制。如图1所示来看看十进制转八进制&am…

我两个月来对Quarkus的了解

又一年,另一个来临,我很荣幸再次开启围绕Java,语言,生态系统和朋友的24篇精彩博客文章的统治,这些博客文章将我们所有人带入了今年最安静的假期。 这已经是第五年了(我只错过了2016年)&#xff…

c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和

本篇的主题是将单元格内一串文本,找出所有数字并求和,如下图。难度较高,新手建议仅了解下,先学会数组运用,再研究此知识点。废话少说,步入正题。重点说明:本篇只针对文本内整数的数字进行提取并…

linux 网络端口全连接扫描,Linux系统下的网络端口扫描工具Nmap

Linux端口扫描工具nmap and nwatchPort scan简介port Scan的方法介绍 portScan就是一种通过检测对方服务器的开放端口,侦测对方服务器服务的方法。一般可分为主动式和被动式两种。主动式就是通过向对方服务器的特定端口发送数据包,根据应答来判断。以nma…

iphone已停用怎么解锁_两种无密码解锁iPhone锁屏密码的方法

现在很多手机都配备指纹解锁功能,大家平时用惯了指纹解锁,有时候在需要输入锁屏密码的时候反倒记不清密码是什么了。像是手机重启后就需要输入密码解锁,iPhone锁屏密码忘了怎么办?多次输入错误密码还可能导致手机被停用&#xff0…

elisa数据处理过程图解_ELISA原理示意图详解.ppt

ELISA原理示意图详解.ppt免疫酶技术及其应用——ELISA 一、实验目的 了解和掌握免疫酶技术的测定原理。 掌握酶联免疫吸附测定技术的操作步骤,学会利用竞争ELISA的方法,定量测定抗体或抗原。 了解免疫酶技术在生物学和医学研究的重要意义及应用价值。 二…

linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

postgresql某一个进程占用大量CPU,问题排查,目前服务器cpu为4核,内存8G1.查下是不是我们的业务SQLSELECTprocpid,START,now() - START AS lap,current_queryFROM (SELECTbackendid,pg_stat_get_backend_pid(S.backendid) AS procp…