碰到的问题: 在工程中试图给你一个POJO添加一个版本号的属性,由于考虑时间因素因此选择了用这个对象的一些属性的hashcode作为版本号,如果那些属性都没有改变那么这个hashcode不应该改变,反之则改变. 在这些属性中偏巧..有一些是枚举类型. 在测试中发现,如果使用同一个JVM一直调用程序,那么该hashcode一直相同,但是如果重启服务器,开新的JVM,那么这个hashcode将会改变,即使对应的Object的任何属性都没有改变.这就是枚举的hashcode跨JVM不稳定.
调查发现: 在JDK中的Enum.class中 hashcode方法是final的并且直接调用父类Object.class的hashcode方法
这样,枚举的hashcode就和内存地址挂钩也就可能会产生不稳定.google了下这个问题,已经有人给oracle提出bug要求将上面的方法去掉final修饰,不过oracle拒绝了 - -
个人目前的解决方法是调用枚举的name()方法将其转化为String,String的hashcode是稳定的.
一个记录.
调查发现: 在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是稳定的.
一个记录.
枚举类型HashCode不稳定问题
本文探讨了在Java中使用枚举类型的HashCode作为版本号时遇到的问题:即枚举的HashCode在不同JVM实例间不稳定性。介绍了枚举HashCode的工作原理,并提供了一种通过转换为字符串来稳定HashCode的方法。
5246

被折叠的 条评论
为什么被折叠?



