java - 为什么 Object.hashCode() 不遵循 Java 代码约定

标签 java hashcode coding-style

<分区>

是否有任何具体原因,为什么 hashCode 是 Object 类的唯一公共(public)方法,它不遵循 Sun 和后来 Oracle 推荐的 Java 代码约定?我的意思是他们可以将其命名为 toHashCode() 或 getHashCode() 或 createHashCode() 对吗?

编辑: 我讨论了 Java 编程语言的代码约定 (oracle.com/technetwork/java/codeconvtoc-136057.html)。这些约定在 Oracle 的书籍“OCA Java SE 7 程序员 I 学习指南(考试 1Z0-803)(Oracle Press)- Liguori,Robert”中引用

document我们可以阅读如下: “方法应该是动词,大小写混合 首字母小写,首字母为 每个内部单词都大写。”。

AFAIK 哈希码不是动词。

最佳答案

我认为它确实遵循惯例。这完全取决于您所谈论的哪种约定

OP 对 Code Conventions for the Java Programming Language 特别感兴趣, 方法名称的约定包含在 chapter 9 中。 .首先,应该注意的是,该文档不再维护,并包含一个重要的警告:

... the information itself may no longer be valid. The last revision to this document was made on April 20, 1999

当然,hashCode() 方法早于 1999 年,所以我们可以引用该文档,看看有问题的方法是否违反了当时的约定。该文件指出:

Methods should be verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized.

关于hashCode(),毫无疑问是首字母小写的混合大小写。但是,OP 似乎认为它违反了方法应该是动词 的约定;隐含的假设是“哈希码”或“哈希码”是一个名词。

在判断之前,我们先看约定的第三部分:每个内部词的第一个字母[是]大写。如果您简单地假设原作者遵循这些约定,那么 hashCode() 的大写表示其作者认为“hash”和“code”是不同的词。如果你把它们分开对待,“hash”这个词在英语中是一个动词。通过这种解释,公约的所有部分都得到满足。

不可否认,术语“哈希码”已经成为(至少)Java 开发人员的常用行话,并且经常被视为名词——可能在很大程度上是因为这个方法的名称。 (鸡诉蛋?)但只有原作者才能表达他们的意图


在我原来的回答中,我使用了 JavaBeans以约定为例:

A bean is a Java class with method names that follow the JavaBeans guidelines. A bean builder tool uses introspection to examine the bean class. Based on this inspection, the bean builder tool can figure out the bean's properties, methods, and events.

在 JavaBeans 中,通过“getter”方法访问属性,即通过调用 getFoo() 读取“foo”属性。但是,hashCode() 方法是 Java 语言对 Object 的所有子类强加的技术要求 但是通常不是对象表示的“业务逻辑”的属性。如果您编写一个类来表示水果,它将具有 getColor()isSkinEdible() 等属性。如果不是 Java 的技术要求,您可能不会考虑编写类似 getHashCode() 的方法,因为...您是否找到过带有哈希码的真实活香蕉?

如果 hashCode() 被命名为 getHashCode() 那么,对于这个约定,JavaBeans 将不得不对其进行特殊处理以忽略它。或者它会始终检查该“属性”,以了解在您的程序的主要逻辑中通常用处不大的内容。


我无法在这个答案中涵盖所有可能的约定,但我对问题中给出的其他示例有这些想法:

  • createHashCode() - 我不会使用它,即使按照惯例,因为 hashCode() 返回一个 int(a原始)并且它们不像引用类型(对象)那样创建。我认为这是错误的动词。

  • toHashCode() - 对我来说,这代表一个转换。但这不是 hashCode() 所做的。如果 foo.hashCode() 返回 42 我不应该期望 42 以任何方式代表 foo .它是根据 foo 实例的信息计算得出的,但没有其他真正的相关性。许多其他实例(许多类的)可以返回 42,因此它不是其中任何一个的替代品或类似物。

关于java - 为什么 Object.hashCode() 不遵循 Java 代码约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196520/

相关文章:

java - JSF-Spring集成应用中如何开启CSRF保护

c# - 如何在不破坏现有 Object.Equals() 的情况下仅检查两个对象的属性是否相等?

javascript - 在 Angular 中使用 $parent 是一个好习惯吗?

Ruby:除非与如果不是

java - 在命令行中执行sikuli?

Java 和 Xerces : can't find property XMLConstants. ACCESS_EXTERNAL_DTD

java - 持久化实体后,数据库表中的默认列值为空

java - 为对象生成唯一的 MD5 哈希值

hash - 动态完美哈希和通用哈希函数 - 请解释一下?

jquery - 如何覆盖 jQuery UI 小部件样式并保留功能