在Eclipse IDE(核心Java)中进行调试时,会显示检查对象后跟一个id,例如: myObject = MyClass(id = 123)
为了检测非预期的对象更改,记录任何OID也会有所帮助。 知道如何编写返回对象特定唯一ID的getOid()方法吗? 它不需要是可序列化的,它只是在一次运行中使用。 与hashCode()相比,OID必须是唯一的。 这个getOid()可以返回int,long,String或其他任何可打印的东西。 提前谢谢
答案 0 :(得分:1)
我相信System.identityHashCode(Object x)就是你要找的东西。由javadoc给出,它打印出与对象默认hashCode()打印的值相同的值。这应该是唯一的,因为它通常是对象的内存地址。在这种情况下,您也可以使用默认的hashCode()。
您还可以使用java.util.Objects.hash(Object ... values)覆盖hashCode()方法并传入对象的字段。这将验证您对象的内部结构是否正在发生变化。
但是,您是否尝试跟踪Eclipse定义的相同内部ID?我不是肯定的,但我怀疑它是由Eclipse调试器在内部分配的,并且对您无法使用。
答案 1 :(得分:0)
好的,我通过所有构造函数中使用的序列生成器'OIDGenerator'来解决它:
公共类OIDGenerator {
private static OIDGenerator mOIDGen;
private static long mOID;
/**
* Singleton Constructor
*/
private OIDGenerator() {
mOID = 0;
}
public static long longNext() {
if( mOIDGen == null) {
mOIDGen = new OIDGenerator(); // => init 0
}
return ++mOID;
}
public static String next() {
return new StringBuffer( "@").append( String.valueOf( longNext())).toString();
}
}
所有类中的成员变量:
private final transient String mOID;
在他们的构造函数中:
mOID = OIDGenerator.next();
提供的方法:
@Override
public String getOID() {
return mOID;
}
答案 2 :(得分:0)
没有OIDGenerator构造函数的更简单的版本:
公共类OIDGenerator {
private static long sOID = 0;
public static long longNext() {
return ++sOID;
}
public static String next() {
return new StringBuffer( "@").append( String.valueOf( longNext())).toString();
}
}
但请记住,由于静态变量,两个版本都无法在服务器集群中使用。