java - 为什么在 Enum hashCode() 中引用 Object hashCode() 实现,而不是 ordinal() 函数?

标签 java enums hashcode jls

<分区>

我一直认为 enum hashCode 指的是 Java 中的 ordinal,因为 ordinal 似乎是 hashCode 的完美候选者,但事实证明 enum hashCode 实际上是指默认的 hashCode 对象 实现。

我明白,这与 JLS 并不矛盾,但这仍然让我感到惊讶,我想不出为什么要这样做。虽然我猜想 JVM 可能会以某种方式依赖它来提供独特的保证,但这对 64 位 JVM 来说不再适用。

我已经检查了 JDK 1.6 和最新的 JDK 7,两者的方式相同。

有谁知道为什么会这样吗?

使用 ordinal 作为 hashCode 非常有意义,因为它满足所有需要的凭据,而且它甚至从一个 JVM 开始到另一个都是一致的,这不是必需的,但拥有它是件好事。

最佳答案

想象一下这个微不足道的、完全虚构的场景:

interface MediaType {}

enum BookTypes implements MediaType {
    HARDCOVER;
}

enum MagazineTypes implements MediaType {
    MONTHLY;
}

Map<MediaType, MediaItem> itemMap = new HashMap<MediaType, MediaItem>();
itemMap.put(BookTypes.HARDCOVER, new Book());
itemMap.put(MagazineTypes.MONTHLY, new Magazine());

我想很清楚为什么您不想在这种情况下使用序号作为哈希码。

关于java - 为什么在 Enum hashCode() 中引用 Object hashCode() 实现,而不是 ordinal() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15241818/

相关文章:

c++ - typedef 和枚举或枚举类

scala - 在Scala中实现equals和hashCode的标准习语是什么?

java - 如果 Java 的垃圾收集器移动对象,Object.hashCode 和 System.identityHashCode 是什么?

java - hashcode() 的有效且高效的实现

java.lang.IllegalStateException : This consumer has already been closed

java - Android ImageSwitcher 内存不足错误

Java泛化方法来验证对象参数中的空值

c# - .net FlagsAttribute 枚举是否需要手动赋值?

java - 如何构建我自己的应用程序设置

c# - 标记 Enum 和具有重叠含义的互斥 Enum