不可将您的方法命名为“等于”
(当然,除非您确实重写了Object.equals()
)。
我偶然发现了用户Frank的一个非常奇怪的Stack Overflow问题 :
为什么Java的Area#equals方法不能覆盖Object#equals?
有趣的是,有一个Area.equals(Area)
方法实际上采用Area
参数,而不是Object.equals()
声明的Object
参数。 弗兰克(Frank)发现,这会导致令人讨厌的行为:
@org.junit.Test
public void testEquals() {java.awt.geom.Area a = new java.awt.geom.Area();java.awt.geom.Area b = new java.awt.geom.Area();assertTrue(a.equals(b)); // -> truejava.lang.Object o = b;assertTrue(a.equals(o)); // -> false
}
从技术上讲,以这种方式实现AWT的Area是正确的(因为也没有实现hashCode()
),但是Java解析方法的方式以及程序员摘要已像上述代码一样编写的代码的方式是重载equals方法确实是一个可怕的主意。
也没有静态等于
这些规则也适用于静态equals()
方法,例如Apache Commons Lang的
ObjectUtils.equals(Object o1, Object o2)
由于您无法静态导入此equals方法,因此造成了混乱:
import static org.apache.commons.lang.ObjectUtils.equals;
现在,输入以下内容:
equals(obj1, obj2);
您将得到一个编译器错误:
Object类型中的equals(Object)方法不适用于参数(…,…)
这样做的原因是,在当前类及其父类型范围内的方法将始终隐藏以这种方式导入的任何内容。 以下内容也不起作用:
import static org.apache.commons.lang.ObjectUtils.defaultIfNull;public class Test {void test() {defaultIfNull(null, null);// ^^ compilation error here}void defaultIfNull() {}
}
此堆栈溢出问题中的详细信息 。
结论
结论很简单。 永远不要重载Object
声明的任何方法 (当然可以重写)。 这包括:
clone()
equals()
finalize()
getClass()
hashCode()
notify()
notifyAll()
toString()
wait()
当然,如果不首先在Object
中声明这些方法,那将是很棒的事情,但是那艘船已经航行了20年。
翻译自: https://www.javacodegeeks.com/2015/02/thou-shalt-not-name-thy-method-equals.html
不可将您的方法命名为“等于”相关推荐
- 小程序可不可以汉字命名_不可将您的方法命名为“等于”
小程序可不可以汉字命名 (当然,除非您确实重写了Object.equals() ). 我偶然发现了用户Frank提出的一个非常奇怪的Stack Overflow问题 : 为什么Java的Area#eq ...
- python setdefault函数_python中字典中的赋值技巧,update批量更新、比较setdefault方法与等于赋值...
知识回顾: 之前这节主要学习了字典的删除,主要涉及到两个方法: 1. Pop方法:删除指定的键的键值对.需要指定一个自己已知的键,删除后返回的是键对应的值. 2. Popitem方法:删除的是最后一个 ...
- 自学前端 | 方法不对等于白学
先说一个初学者很容易犯的错误:上来就通过项目学习. 很多初学者上来就想通过做项目学习,的确多练项目是可以提升技术的,但这要加一个前提是你对这门技术有基本的了解或者说你对编程有了一定的了解. 如果你连基 ...
- Java学习 -- 方法
文章目录 方法概述 什么是方法? 方法的结构 方法使用 方法定义和调用 方法调用注意 方法三种调用格式 方法重载 方法重载前 方法重载后 重载练习 练习1 练习2 方法递归 递归常见应用 求n的阶乘 ...
- Lua程序设计 | 模块和包、泛型迭代器和for、元表和元方法
From<Programming in Lua> by Roberto Ierusalimschy 文章目录 模块和包 函数 require 模块重命名 搜索路径 搜索器 Lua语言中编写 ...
- 全新池化方法AdaPool | 让ResNet、DenseNet、ResNeXt等在所有下游任务轻松涨点
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 池化层是卷积神经网络的基本构建模块,它不仅可以减少网络的计算开 ...
- 最新开源无监督单目深度估计方法,解决复杂室内场景难训练问题,效果性能远超SOTA...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 一.摘要 无监督单目深度估计算法已经被证明能够在驾驶场景(如KITTI数据集)中得到精确的结果,然而最 ...
- JavaScript中this关键字使用方法详解
在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...
- ASP.NET Core - Razor页面之Handlers处理方法
简介 在前一篇文章中,我们讨论了Razor页面.今天我们来谈谈处理方法(Handlers). 我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs ...
最新文章
- html站点相对路径,HTML的相对路径和绝对路径?
- javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
- 如何设计系统的错误码及错误信息
- php操作mysql数据库的扩展有哪些_8.PHP操作MySQL数据库(Mysqli扩展)
- Java解析JSON时,new JSONObject(这儿写json字符串)报错问题
- pl/sql里的exists和in的差别
- S/4HANA key user tool创建的Extension field,点了publish后的执行原理
- Oracle中修改存储过程名语句,修改存储过程中使用的语句是,select 语句使用存储过程...
- PHP7-MySQLi在分页中的应用
- JAVA程序员的学习网站(2)
- 瑞友天翼应用虚拟化系统服务器lP,瑞友天翼应用虚拟化系统 V6.0.6发版
- C语言负数的小数次方,c语言 10 负次方
- mybatis报错:Could not find resource com/**/dao/Mapper.xml
- Django对接微信公众号以实现消息自动回复
- 【颜纠日记】如何清除cookie方法,保护你的隐私。
- Linux mkdir、touch、mv、cp等命令的介绍与使用
- 【记录】一个自动投票的小程序(python实现)
- win10怎么快捷锁定计算机,win10一键快速锁屏快捷键的两种使用方法
- 使用labelimg标注图片
- 新增订单统计信息 (20 分)
热门文章
- Redis(案例一:注册登录-图形验证码+谷歌开源Kaptcha)
- SpringCloud Netflix Ribbon
- Java毕设动物管理系统_java毕业设计_springboot框架的现代化动物园管理系统EB
- 在win10系统中安装Visual C++ 6.0的具体方法
- linux-basic(6)linux的文件权限与目录配置
- 如何评价分类模型性能?(足球荔枝)
- 如何在win7(xp)home version下安装 rose 32 bit
- 生成configDataContextRefres失败:Error creating bean with name ‘configDataContextRefresher‘
- POJ3278(BFS入门)
- JDK8的日期时间类2