在Eclipse IDE(核心Java)中调试时,检查对象后面跟着一个id,例如:myObject=MyClass(id=123)
对于检测意外的对象更改,记录任何OID也会很有帮助。知道如何编写一个返回特定于对象的唯一ID的getOid()方法吗?它不需要是可序列化的,它只是在一次运行中使用。与hashCode()相反,OID必须是唯一的。此getOid()可以返回int、long、String或任何可打印的内容。提前感谢
我相信System.identityHashCode(Object x)就是您想要的。正如javadoc给出的,它打印出的值与对象默认hashCode()打印的值相同。这应该是唯一的,因为它通常是对象的内存地址。在这种情况下,您也可以使用默认的hashCode()。
您还可以使用java.util.Objects.hash(Object…values)重写hashCode()方法并传入对象的字段。这将为您验证对象的内部没有更改。
但是,您是否试图跟踪Eclipse定义的相同内部ID?我不是肯定的,但我怀疑这是Eclipse调试器内部分配的,对您来说不可用。
好的,我通过所有构造函数中使用的序列生成器"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;
}
没有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();
}
}
但请记住,由于存在静态变量,两个版本都不能在服务器集群中使用。