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

参见英文答案 > What is the reason behind Enum.hashCode()?7个
我一直以为enum hashCode在Java中引用了序数,因为序数似乎是hashCode的完美候选者,但事实证明它的枚举hashCode实际上是指认的hashCode对象实现.

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

我已经检查过JDK 1.6和最新的JDK 7,这两种方式都是一样的.

有没有人知道原因,是这样做的?

使用序数作为hashCode是完全合理的,因为它满足了所需的所有凭证,而且从一个JVM开始到另一个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());

我认为很明显为什么你不想在这个实例中使用ordinal作为哈希码.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...