pdf可不可以批量命名_不可将您的方法命名为“等于”

news/2024/5/19 2:26:48 标签: java, object, tomcat, hashcode, 反射
pdf可不可以批量命名

pdf可不可以批量命名

(当然,除非您确实重写了Object.equals() )。

我偶然发现了用户Frank的一个非常奇怪的Stack Overflow问题:

为什么Java的Area#equals方法不能覆盖Object#equals?

有趣的是,有一个Area.equals(Area)方法真正采用Area参数,而不是Object.equals()声明的Object参数。 弗兰克(Frank)发现,这会导致令人讨厌的行为:

java">@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)); // -> true

    java.lang.Object o = b;
    assertTrue(a.equals(o)); // -> false
}

从技术上讲,以这种方式实现AWT的Area是正确的(因为也没有实现hashCode() ),但是Java解析方法的方式以及程序员摘要已像上述代码一样编写的代码的方式是重载equals方法确实是一个可怕的主意。

也不等于静态

这些规则也适用于静态equals()方法,例如Apache Commons Lang的

java">ObjectUtils.equals(Object o1, Object o2)

由于您无法静态导入此equals方法,因此造成了混乱:

java">import static org.apache.commons.lang.ObjectUtils.equals;

现在,输入以下内容:

java">equals(obj1, obj2);

您将得到一个编译器错误:

Object类型中的equals(Object)方法不适用于参数(…,…)

这样做的原因是,在当前类及其父类型范围内的方法将始终隐藏以这种方式导入的任何内容。 以下内容也不起作用:

java">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

pdf可不可以批量命名


http://www.niftyadmin.cn/n/1707775.html

相关文章

2019年Java常见面试问题

文章目录一.JAVAJava中8大基本类型占用的字节数?和equals的区别是什么?final在java中有什么作用?java容器有哪些?HashMap和Hashtable有什么区别?HashMap的实现原理?ArrayList和LinkedList的区别是什么?sleep()和wait()有什么区别?在java程序中怎么保证多线程的运行安全…

full gc_在运行时打开GC日志记录

full gc总是有下一个JVM表现不佳。 而且,您内心深知,如果您只有少数启动选项可以揭示有关正在发生的事情的更多信息,则您可能有机会真正修复该死的东西。 但是不,您需要的标志( -XX: HeapDumpOnOutOfMemoryError或-XX&…

java基础总结大全

文章目录一、基础知识:1、JVM、JRE和JDK的区别:2、环境变量path和classpath的作用是什么?3、变量有什么用?为什么要定义变量?什么时候用?4、&和&&的区别?5、标示符命名规则6、数据类型&#x…

oauth2_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

oauth2将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰,那么我想您也希望跳过填写表单和输入新密码的操作。 只要有权限,许多人都希望使用第三方登录,只要他们要求…

EXTJS学习笔记

sencha which set PATH%PATH%;C:\Sencha\Cmd\6.0.0.92 sencha generate app --ext MyApp ./myapp 将会创建名为 MyApp 的 Ext JS 应用,应用所有的文件都放在 当前目录下名为 myapp 的文件夹。 extjs 1.基本结构: Ext.define(‘Car’,{ name:null, constructor:…

输入捕获_企业应用程序中要捕获的5大Java性能指标

输入捕获有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗? 立即开始免费试用! 最后几篇文章介绍了应用程序性能管理(APM),并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这些主题,以评估您的企业Java…

lambda表达式_Lambdas中的例外:有点混乱的优雅解决方案

lambda表达式考虑以下用于写入文件的功能: 该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStream , SnappyOuputStream(快速压缩)或简单的FileInputStream 。 …

页面跳转_跳转到企业缓存之前要考虑的事情

页面跳转介绍 关系数据库事务是ACID ,强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置,因此,只要数据访问层开始出现性能问题,就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性能,但是…