FindBugs问题EQ_COMPARETO_USE_OBJECT_EQUALS的解决方法

这篇具有很好参考价值的文章主要介绍了FindBugs问题EQ_COMPARETO_USE_OBJECT_EQUALS的解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文记录的是2016年4月初发生的事情。


前几天,标准CI的静态检查页面发现一个项目组同事引入的FindBugs问题,EQ_COMPARETO_USE_OBJECT_EQUALS,CI对这个问题给出的介绍如下

Class defines compareTo(...) and uses Object.equals()

同事没见过这个问题,不了解如何修改,于是在中午回基地吃饭的路上一起讨论这个问题。

其实这个问题并不复杂,也不困难。FindBugs工具是在抱怨一个Java Bean类实现了Comparable接口,但却使用了父类(java.lang.Object类)的equals方法,没有覆盖父类的实现,违反了接口的使用规则。

因此消除EQ_COMPARETO_USE_OBJECT_EQUALS的方法:

  • 在这个Java Bean类中覆盖父类的equals方法;

  • 对于Java Bean类的两个对象x和y,equals方法的实现保证如下等式成立

      x.compareTo(y) == 0时,x.equals(y)为true
    

修改方法很简单,本项目使用了Lombok,因此为Java Bean类实现equals方法并不需要写代码。同时Lombok还很贴心的生成了hashCode方法,这又避免了另外一个FindBugs问题,即实现equals方法时,需要同步实现hashCode方法。

问题按时解决了,成功避免项目组被部门通报、晾晒。那么接下来需要复习一下功课,避免后续掉到相同的坑里。如下是相关的资料,作为对上述修改方法的补充说明,蛮好理解的,所以就不费神转换了。

EQ_COMPARETO_USE_OBJECT_EQUALS的官方定义

如下截取自FindBugs官方文档

This class defines a compareTo(...) method but inherits its equals() method from java.lang.Object.
Generally, the value of compareTo should return zero if and only if equals returns true.
If this is violated, weird and unpredictable failures will occur in classes such as PriorityQueue.
In Java 5 the PriorityQueue.remove method uses the compareTo method, while in Java 6 it uses the equals method.

From the JavaDoc for the compareTo method in the Comparable interface:

It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)).
Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact.
The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."

Comparable的官方文档

如下截取自Java官方文档。

public interface Comparable

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.

Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort). Objects that implement this interface can be used as keys in a sorted map or as elements in a sorted set, without the need to specify a comparator.

The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C. Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.
It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals method.

For example, if one adds two keys a and b such that (!a.equals(b) && a.compareTo(b) == 0) to a sorted set that does not use an explicit comparator, the second add operation returns false (and the size of the sorted set does not increase) because a and b are equivalent from the sorted set's perspective.

Virtually all Java core classes that implement Comparable have natural orderings that are consistent with equals. One exception is java.math.BigDecimal, whose natural ordering equates BigDecimal objects with equal values and different precisions (such as 4.0 and 4.00).

For the mathematically inclined, the relation that defines the natural ordering on a given class C is:

{(x, y) such that x.compareTo(y) <= 0}.

The quotient for this total order is:
{(x, y) such that x.compareTo(y) == 0}.
It follows immediately from the contract for compareTo that the quotient is an equivalence relation on C, and that the natural ordering is a total order on C. When we say that a class's natural ordering is consistent with equals, we mean that the quotient for the natural ordering is the equivalence relation defined by the class's equals(Object) method:

{(x, y) such that x.equals(y)}. 

This interface is a member of the Java Collections Framework.

高等代数 or 离散数学

看过上面截取的材料,突然发现接口ComparablecompareTo方法满足如下要求:

  1. 自反,即x.compareTo(x) == 0
  2. 对称,即x.compareTo(y) == 0,同时y.compareTo(x) == 0
  3. 传递,如果x.compareTo(y) == 0并且y.compareTo(z) == 0,那么一定有x.compareTo(z) == 0

不由得赞叹老外写文档时的确是相当的用心,值得学习。另外更加觉得当年读数学系的信息与计算科学专业是正确的选择。文章来源地址https://www.toymoban.com/news/detail-765136.html

资料

  • FindBugs - how to solve EQ_COMPARETO_USE_OBJECT_EQUALS
  • FindBugs Bug Descriptions

到了这里,关于FindBugs问题EQ_COMPARETO_USE_OBJECT_EQUALS的解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BigDecimal的equals方法和compareTo方法的区别

    面试经常会问道为什么不能用BigDecimal的equals方法做等值比较? 其实BigDecimal的equals方法和compareTo并不一样,equals方法会比较两部分内容,分别是值(value)和标度(scale),而对于1.0和1这两个数字,他们的值虽然一样,但是精度是不一样的,在使用equals比较的时候会返回fals

    2024年02月04日
    浏览(34)
  • ROS2 use_sim_time 使用问题

    在默认的情况下, use_sim_time 在 rclcpp 客户端下为 false ,rclcpp 客户端库将使用计算机的系统时钟作为时间源。如果将 use_sim_time 设置为 true , 则 rclcpp 客户端库使用模拟时钟,这时可以使用仿真系统,或者回放记录的数据,方便应用层调试,增加代码开发的灵活性。 为了支持这

    2024年02月09日
    浏览(45)
  • JS输出为[object object]取值问题

    传参前数据能打印出来,传参后显示[object object]且无法取值 传递 接收后端返回的json对象通常是一个字符串类型的object 所以 通过 JSON.stringify() 把 JavaScript 对象转换为字符串。 接收 在从 web 服务器接收数据时,数据永远是字符串。 通过 JSON.parse() 解析数据,这些数据会成为

    2024年02月02日
    浏览(73)
  • QueryWrapper中eq的用法案例

    底层运行结果: Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66061384] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection@704441103 wrapping com.mysql.cj.jdbc.ConnectionImpl@4e911e70] will not be managed by Spring Preparing: SELECT COUNT( * )

    2024年02月13日
    浏览(38)
  • 解决 JavaScript 输出为 [object Object] 的问题

    🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,计算机系列(火速更新中) 💭 格言:种一棵树最好的时间是十年前,其次是现在 🏡动动小手,点个关注不迷路,感

    2024年02月04日
    浏览(41)
  • [零刻]EQ12安装PVE虚拟机教程

        Proxmox VE是一个运行虚拟机和容器的平台。基于Debian Linux,完全开源。为了获得最大的灵活性,实现了两种虚拟化技术——基于内核的虚拟机(KVM)和基于容器的虚拟化(LXC)。一个主要的设计目标是使管理尽可能容易。运行在单个节点上使用Proxmox VE,也可以组装多个节点的集

    2024年02月06日
    浏览(92)
  • 勾选Use Microlib报错,解决编译出现Undefined symbol __use_two_region_memory 和Undefined symbol __initial_sp的问题

    在使用STM32串口打印函数过程中,我们往往会勾选 Use Microlib . 但是近期发现,勾选后编译会报俩个错误。 1. Undefined symbol __use_two_region_memory 2. Undefined symbol __initial_sp 解决方法:         打开 startup_stm32f103xb.s 文件, 翻到最底下找到图片中的两个语句。 将两句先 注释,编译,

    2024年02月13日
    浏览(69)
  • JS-Object无序问题

    在开发图表功能时,由于历史原因,后端返回的图表数据如下: 是对象类型,键为日期,值为日期和当天日期的值。在H5端、微信小程序端运行结果正常,结果到了百度小程序突然发现,这个值的顺序是混乱的,时间有时前面的日期在后面,后面的日期在前面(百度小程序id

    2024年02月08日
    浏览(29)
  • 【计算机视觉】简述对EQ-Net的理解

    最近又看了一些点云分割的文章,近两年点云分割的文章是真的少,不知道是不是点云分割算法接近了末端。这篇文章主要提出了一个基于查询方法的统一范式,它解决了一些不仅仅是点云分割的问题,还解决了三维点云分类和三维目标检测的问题。 文章整体结构如上图,可

    2024年02月16日
    浏览(33)
  • 【EQ-R】在安卓中使用filament(sceneform)材质(二)

    简介 EQ-Renderer是EQ基于sceneform(filament)扩展的一个用于安卓端的三维AR渲染器。 主要功能 它包含sceneform_v1.16.0中九成接口(剔除了如sfb资源加载等已弃用的内容),扩展了视频背景视图、解决了sceneform模型加载的内存泄漏问题、集成了AREngine和ORB-SLAM3、添加了场景坐标与地理

    2024年03月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包