枚举的hashcode跨JVM不稳定

枚举类型HashCode不稳定问题
本文探讨了在Java中使用枚举类型的HashCode作为版本号时遇到的问题:即枚举的HashCode在不同JVM实例间不稳定性。介绍了枚举HashCode的工作原理,并提供了一种通过转换为字符串来稳定HashCode的方法。
碰到的问题: 在工程中试图给你一个POJO添加一个版本号的属性,由于考虑时间因素因此选择了用这个对象的一些属性的hashcode作为版本号,如果那些属性都没有改变那么这个hashcode不应该改变,反之则改变. 在这些属性中偏巧..有一些是枚举类型. 在测试中发现,如果使用同一个JVM一直调用程序,那么该hashcode一直相同,但是如果重启服务器,开新的JVM,那么这个hashcode将会改变,即使对应的Object的任何属性都没有改变.这就是枚举的hashcode跨JVM不稳定.

调查发现: 在JDK中的Enum.class中 hashcode方法是final的并且直接调用父类Object.class的hashcode方法

/**
* Returns a hash code for this enum constant.
*
* @return a hash code for this enum constant.
*/
public final int hashCode() { //不允许子类重写
return super.hashCode();
}


这样,枚举的hashcode就和内存地址挂钩也就可能会产生不稳定.google了下这个问题,已经有人给oracle提出bug要求将上面的方法去掉final修饰,不过oracle拒绝了 - -

个人目前的解决方法是调用枚举的name()方法将其转化为String,String的hashcode是稳定的.

一个记录.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值