碰到的问题: 在工程中试图给你一个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是稳定的.
一个记录.